网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  使用java中的动态代理实现数据库连接池(2)     
  文章作者:未知  文章来源:水木森林  
  查看:94次  录入:管理员--2007-11-17  
 
  使用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毫秒看是否还有空闲连接,如果没有抛出异常
* @return connection
* @throws sqlexception
*/
protected synchronized connection getfreeconnection(long ntimeout)
throws sqlexception
{
connection conn = null;
iterator iter = conns.iterator();
while(iter.hasnext()){
_connection _conn = (_connection)iter.next();
if(!_conn.isinuse()){
conn = _conn.getconnection();
_conn.setinuse(true);
break;
}
}
if(conn == null && ntimeout > 0){
//等待ntimeout毫秒以便看是否有空闲连接
try{
thread.sleep(ntimeout);
}catch(exception e){}
conn = getfreeconnection(0);
if(conn == null)
throw new sqlexception("没有可用的数据库连接");
}
return conn;
}

(未完待续)
 
 
上一篇: 使用java生成pdf文档    下一篇: 使用jboss和postgresql-快速开发ejb和j2ee web application
  相关文档
servlet技巧abc 11-17
java i/o api之性能分析 (下) 11-16
shark api 应用:获得父流程(parent process) 11-17
eclipse 的历史、现状和未来 11-17
java socket编程(三)服务器sockets 11-16
j2me midp开发综合实例 11-16
用 apache jmeter 测试 websphere 性能(1) 11-17
java语言的中文处理 11-17
jbuilderx 常见问题faq 11-17
java学习推荐书籍 11-17
在网页上发布统计曲线 11-17
jakarta-cactus-12-1.7.1.zip 11-17
给.net中的windows窗体加载xp样式 11-17
flex1.5以及flex builder 1.5安装以及结合tomcat5的配置。 11-17
java开源项目hibernate 11-16
osworkflow 小培训(1) 11-17
深入探索corba对象生命周期之慨述 11-16
jsp核心技术和电子商务应用实例源代码分析 11-17
java高级--java中异常机制的深入研究 11-16
在java中连接oracle数据库 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息