首页  韩国资源  酷站加油  我的展厅  设计名站  古典元素  推荐下载  设计欣赏  每周专访  招募精英  人才专区  网页教程  平面设计  编程开发  设计竞赛
当前位置:首页 > 编程开发 > JSP教程 > 正文
Google
JAVA中的动态代理实现数据库连接池
来源:赛迪网 2008年04月28日 08:47 网友评论:0条 点击:

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;

}

首页 上一页 [1] [2] [3] [4] 下一页 尾页
上一篇:JavaMai安装和配置的常见问题   下一篇:新手入门的几大要点
收藏此页】【打印】【关闭
 相关文章  我要点评
·Javascript"篱式"条件判断
·解决Oracle数据库返回cursor问题
·Oracle数据库中sys和system两个用户的区别
·解决无法打开用户默认数据库的方法
·修改Sybase数据库sa密码的方法
·Oracle数据库SQLPLUS中几个常用set语句
·Oracle数据库冷备份恢复的具体步骤
·在SQL Server数据库中导入导出数据

免责声明:本站刊载此文不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。对本文有任何异议,请联络:68design#163.com
转载要求:作者及来源信息必需保留。转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印。



关于我们 | 在线反馈 | 广告报价 | 友情链接 | 联系我们 | 免责声明 | 在线投稿 | 网站地图
Copyright © 2003-2007 68design.net, All Rights Reserve 【找网页设计师,当然上网页设计师联盟】