快速业务通道

使用JAVA中的动态代理实现数据库连接池 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
除一个数据库连接池对象 * @param name * @throws NameNotFoundException */ public static void unbind(String name) throws NameNotFoundException { DataSource dataSource = lookup(name); if(dataSource instanceof DataSourceImpl){ DataSourceImpl dsi = (DataSourceImpl)dataSource; try{ dsi.stop(); dsi.close(); }catch(Exception e){ }finally{ dsi = null; } } connectionPools.remove(name); } }

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

时间:2010-12-14 IBM 刘冬

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();

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

时间:2010-12-14 IBM 刘冬

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毫秒看是否还有空闲连接,如果

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号