博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理连接数据库
阅读量:5246 次
发布时间:2019-06-14

本文共 3555 字,大约阅读时间需要 11 分钟。

package 动态连接数据库;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.sql.Connection;import java.sql.DriverManager;import java.util.LinkedList;public class UtilsDB {    public static void main(String[] args) {        UtilsDB u = new UtilsDB();        System.err.println(u.getCon());    }    private static LinkedList
pool = new LinkedList
(); static { try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql:///abc"; for (int i = 0; i < 3; i++) { // 真实对象 final Connection con = DriverManager.getConnection(url, "root", "1234"); // 声明代理 Object obj = Proxy.newProxyInstance( UtilsDB.class.getClassLoader(), new Class[] { Connection.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("close")) { System.err.println("有人还连接"); synchronized (pool) { pool.addLast((Connection) proxy); pool.notifyAll(); return null; } } else { return method.invoke(con, args); } } }); // 将代理人添加到pool pool.add((Connection) obj); } } catch (Exception e) { throw new RuntimeException(e); } } public static Connection getCon() { synchronized (pool) { if (pool.size() == 0) { try { pool.wait(); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } return getCon(); } else { Connection con = pool.removeFirst(); System.err.println("pool.size:" + pool.size()); return con; } } }}
package 动态连接数据库;import java.sql.Connection;import java.sql.SQLException;import java.sql.Statement;public class TestDb {    public static void main(String[] args) {        //Connection con=UtilsDB.getCon();        //System.err.println(con);                            for (int i = 0; i < 110; i++) {            new Thread() {                public void run() {                    Connection con = UtilsDB.getCon();                    try {                        Statement st = con.createStatement();                        System.err.println(con + "\t" + this.getName() + "\t"                                + st);                    } catch (SQLException e) {                        e.printStackTrace();                    } finally {                        try {                            con.close();                        } catch (SQLException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                        }                    }                };            }.start();        }    }}

转载于:https://www.cnblogs.com/xiaweifeng/p/3703308.html

你可能感兴趣的文章
android 签名
查看>>
vue项目中使用百度统计
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>
shell脚本
查看>>
Upload Image to .NET Core 2.1 API
查看>>
Js时间处理
查看>>
Java项目xml相关配置
查看>>
三维变换概述
查看>>
第三次作业
查看>>
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>