使用JAVA中的动态代理实现数据库连接池(2)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

使用Java中的动态代理实现数据库连接池(2)

ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码:

String name = "pool";

String driver = " sun.jdbc.odbc.JdbcOdbcDriver ";

String url = "jdbc:odbc:datasource";

ConnectionParam param = new ConnectionParam(driver,url,null,null);

param.setMinConnection(1);

param.setMaxConnection(5);

param.setTimeoutValue(20000);

ConnectionFactory.bind(name, param);

System.out.println("bind datasource ok.");

//以上代码是用来登记一个连接池对象,该操作可以在程序初始化只做一次即可

//以下开始就是使用者真正需要写的代码

DataSource ds = ConnectionFactory.lookup(name);

try{

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

Connection conn = ds.getConnection();

try{

testSQL(conn, sql);

}finally{

try{

conn.close();

}catch(Exception e){}

}

}

}catch(Exception e){

e.printStackTrace();

}finally{

ConnectionFactory.unbind(name);

System.out.println("unbind datasource ok.");

System.exit(0);

}

从使用者的示例代码就可以看出,我们已经解决了常规连接池产生的两个问题。但是我们最最关心的是如何解决接管close方法的办法。接管工作主要在ConnectionFactory中的两句代码:

source = new DataSourceImpl(param);

source.initConnection();

DataSourceImpl是一个实现了接口javax.sql.DataSource的类,该类维护着一个连接池的对象。由于该类是一个受保护的类,因此它暴露给使用者的方法只有接口DataSource中定义的方法,其他的所有方法对使用者来说都是不可视的。我们先来关心用户可访问的一个方法getConnection

/**

* @see javax.sql.DataSource#getConnection(String,String)

*/

public Connection getConnection(String user, String passWord) throws SQLException

{

//首先从连接池中找出空闲的对象

Connection conn = getFreeConnection(0);

if(conn == null){

//判定是否超过最大连接数,假如超过最大连接数

//则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接

if(getConnectionCount() >= connParam.getMaxConnection())

conn = getFreeConnection(connParam.getWaitTime());

else{//没有超过连接数,重新获取一个数据库的连接

connParam.setUser(user);

connParam.setPassword(password);

Connection conn2 = DriverManager.getConnection(connParam.getUrl(),

user, password);

//代理将要返回的连接对象

_Connection _conn = new _Connection(conn2,true);

synchronized(conns){

conns.add(_conn);

}

conn = _conn.getConnection();

}

}

return conn;

}

/**

* 从连接池中取一个空闲的连接

* @param nTimeout 假如该参数值为0则没有连接时只是返回一个null

* 否则的话等待nTimeout毫秒看是否还有空闲连接,假如没有抛出异常

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航