Java的动态代理产生Connection

创建数据库连接池:

public class DataSource {

    private InputStream inStream;

    private Properties pro;

    private static int initCount = 5;// 初始连接数

    private static int maxCount = 10;// 数据库最大连接数

    int currentConnt = 0;// 当前数据库的连接数

    LinkedList<Connection> connectionPool=new LinkedList<Connection>();

   

    public DataSource(){

       inStream=this.getClass().getResourceAsStream("/system.properties");

       pro=new Properties();

       try {

           pro.load(inStream);

           try {

              Class.forName(pro.getProperty("driver"));

              for(int i=0;i<initCount;i++){

                  connectionPool.addLast(CreateConnection());

              }

           } catch (ClassNotFoundException e) {

              e.printStackTrace();

           }

          

       } catch (IOException e) {

           e.printStackTrace();

       }

      

    }

   

    private Connection CreateConnection(){

       Connection conn=null;

       MyConnectionProxy myproxy=null;

       try {

           conn=DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("username"), pro.getProperty("password"));

           myproxy=new MyConnectionProxy(this);

       } catch (SQLException e) {

           e.printStackTrace();

       }

       currentConnt++;

       return myproxy.bind(conn);

    }

   

    public Connection GetConnection(){

       synchronized (connectionPool) {

           if(connectionPool.size()>0){

              return connectionPool.removeFirst();

           }

           if(currentConnt<maxCount){

              return CreateConnection();

           }

           throw new RuntimeException("数据库已达到最大连接数!");

       }

    }

}

 

创建代理类

public class MyConnectionProxy implements InvocationHandler {

    private Connection realConnection;

    private Connection proxyConnection;

    private DataSource datasource;

   

    private int maxUseCount = 10;

    private int currentUserCount = 0;

   

    MyConnectionProxy(DataSource ds){

       this.datasource=ds;

    }

   

    Connection bind(Connection conn){

       this.realConnection=conn;

       proxyConnection=(Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, this);

       //Proxy.newProxyInstance()方法表示:产生一个新的类,该类继承于第二个参数Connnection,但该类的方法的现实是由第三个参数this负责实现

       return proxyConnection;

    }

    //MyConnectionProxy类所有方法的实现都是由invoke方法实现

    public Object invoke(Object proxy, Method method, Object[] args)

           throws Throwable {

       if(method.getName().equals("close")){

           this.currentUserCount++;

           if(this.currentUserCount<maxUseCount){

              this.datasource.connectionPool.addLast(this.proxyConnection);

           }else{

              this.realConnection.close();

              this.datasource.currentConnt--;

           }  

       }

       return method.invoke(this.realConnection, args);

    }

 

}

 

JDBC工具类:

public class SQLDBConnection {

    private static SQLDBConnection sqldb;

    private DataSource datasource;

   

    private SQLDBConnection(){

       datasource=new DataSource();

    }

   

    public static SQLDBConnection getSQLDBConnection(){

       if(sqldb==null){

           synchronized (SQLDBConnection.class) {

              if(sqldb==null){

                  sqldb=new SQLDBConnection();

              }

           }

       }

       return sqldb;

    }

   

    public Connection GetConnection(){

        return this.datasource.GetConnection();

    }

   

    public

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值