




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA中数据库连接池的动态实现2010-08-18 09:11:41|分类: 数据库技术 |标签: |字号大中小订阅 首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作,包括关闭连接等。通过对用户使用的描述,怎样可以接管Connection.close方法就成了我们这篇文章的主题。为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对
2、某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler,这两个类都在java.lang.reflect包中。SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法
3、的出路。首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下: public class ConnectionParam implements Serializableprivate String driver; /数据库驱动程序 private String url; /数据连接的URL private String user; /数据库用户名 private String password; /数据库密码 private int minConnection = 0; /初始化连接数
4、private int maxConnection = 50; /最大连接数 private long timeoutValue = 600000;/连接的最大空闲时间 private long waitTime = 30000; /取连接的时候如果没有可用连接最大的等待时间其次是连接池的工厂类ConnectionFactory,通过该类来将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,具体代码如下:/* 连接池类厂,该类常用来保存多个数据源名称合数据库连接池对应的哈希* author liusoft*/public class ConnectionFactor
5、y/该哈希表用来保存数据源名和连接池对象的关系表 static Hashtable connectionPools = null;staticconnectionPools = new Hashtable(2,0.75F);/* 从连接池工厂中获取指定名称对应的连接池对象* param dataSource 连接池对象对应的名称* return DataSource 返回名称对应的连接池对象* throws NameNotFoundException 无法找到指定的连接池*/public static DataSource lookup(String dataSource)throws Nam
6、eNotFoundExceptionObject ds = null;ds = connectionPools.get(dataSource);if(ds = null | !(ds instanceof DataSource)throw new NameNotFoundException(dataSource);return (DataSource)ds;/* 将指定的名字和数据库连接配置绑定在一起并初始化数据库连接池* param name 对应连接池的名称* param param 连接池的配置参数,具体请见类ConnectionParam* return DataSource 如果绑定
7、成功后返回连接池对象* throws NameAlreadyBoundException 一定名字name已经绑定则抛出该异常* throws ClassNotFoundException 无法找到连接池的配置中的驱动程序类* throws IllegalAccessException 连接池配置中的驱动程序类有误* throws InstantiationException 无法实例化驱动程序类* throws SQLException 无法正常连接指定的数据库*/public static DataSource bind(String name, ConnectionParam param
8、)throws NameAlreadyBoundException,ClassNotFoundException,IllegalAccessException,InstantiationException,SQLExceptionDataSourceImpl source = null;trylookup(name);throw new NameAlreadyBoundException(name);catch(NameNotFoundException e)source = new DataSourceImpl(param);source.initConnection();connectio
9、nPools.put(name, source);return source;/* 重新绑定数据库连接池* param name 对应连接池的名称* param param 连接池的配置参数,具体请见类ConnectionParam* return DataSource 如果绑定成功后返回连接池对象* throws NameAlreadyBoundException 一定名字name已经绑定则抛出该异常* throws ClassNotFoundException 无法找到连接池的配置中的驱动程序类* throws IllegalAccessException 连接池配置中的驱动程序类有误*
10、throws InstantiationException 无法实例化驱动程序类* throws SQLException 无法正常连接指定的数据库*/public static DataSource rebind(String name, ConnectionParam param)throws NameAlreadyBoundException,ClassNotFoundException,IllegalAccessException,InstantiationException,SQLExceptiontryunbind(name);catch(Exception e)return bi
11、nd(name, param);/* 删除一个数据库连接池对象* param name* throws NameNotFoundException*/public static void unbind(String name) throws NameNotFoundExceptionDataSource dataSource = lookup(name);if(dataSource instanceof DataSourceImpl)DataSourceImpl dsi = (DataSourceImpl)dataSource;trydsi.stop();dsi.close();catch(E
12、xception e)finallydsi = null;connectionPools.remove(name);ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码:String name = pool;String driver = sun.jdbc.odbc.JdbcOdbcDriver ;String url = jdbc:odbc:datasource;ConnectionParam param = new ConnectionParam(driv
13、er,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);tryfor(int i=0;i= connPa
14、ram.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);sync
15、hronized(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 SQLExceptionConnection conn = null;Iterator iter = conns.iterator();while(iter.hasNext()_Connection _conn = (_Connection)iter.next();if(!_conn.isInUse(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年一建《水利水电工程管理与实务》通关必做强化训练试题库300题及详解
- 财税知识详解
- 游泳救生员初级练习题(含参考答案)
- 中职-哲学与人生课件 第四单元学习资料
- 2025届贵州省黔东南州高三模拟统一测试语文试卷(原卷版+解析版)
- 20254月白酒酒醅淀粉含量监测代理数据协议
- 责任道德讲堂课件
- 遗产处理委托协议
- 集成灶点火开关总成结构
- 建筑工程合同变更程序
- 房地产开发项目资金监管协议
- 持续集成与自动化部署(CICD)-深度研究
- 无人机护林巡检实施方案-LSJ-2019022-六视角科技
- 9 短诗三首 公开课一等奖创新教学设计
- 急性缺血性卒中再灌注治疗指南2024解读
- 北师大版三年级下册数学口算题通关练习1000道带答案
- 初中生心理健康课件
- 2025届河北省衡水市衡水中学高考仿真模拟英语试卷含解析
- 广东广州市2025届高考数学二模试卷含解析
- 【MOOC】城市景观设计-南京铁道职业技术学院 中国大学慕课MOOC答案
- 医疗机构医疗废物管理规范考试试题及答案
评论
0/150
提交评论