用于 Java 程序(J2SE, JSP/Servlet) 的可直接返回连接以及定时关闭超时连接的连接池程序

来源:互联网 发布:福州市各县区经济数据 编辑:程序博客网 时间:2024/06/04 19:48
用于 Java 程序(J2SE, JSP/Servlet) 的可直接返回连接以及定时关闭超时连接的连接池程序
         
项目文件说明(本项目文件可以使用 JBuider 7 以上版本打开, 或者 Eclipse 也可以导入本项目):
         /archive/jdbc_conn_pool.jar                 打包后的 JAR 文件, 包含所有编译后的类文件(不包含 db.properties)
         /archive/jdbc_conn_pool_src.jar    打包后的 JAR 文件, 包含所有 .java 源文件(包含 db.properties)
         /sql/            测试用的 ODBC 数据库文件(test.mdb)  Mysql 建表脚本
         /src             源程序
        /sql             用到的测试数据库(Access 数据库文件和 MySQL 脚本)
        /WebModule       测试此连接池的 Web 应用(test.jsp)
         /odbcsetup.exe   安装软件目录/odbc/test.mdb  ODBC 的系统数据源 test 的自动安装程序
         /odbcsetup.iss   安装程序的生成脚本(InnoSetup 4.2.7, http://www.innosetup.com)
 
    更新历史:
    2005-01-09
    将超时后自动关闭数据库连接的默认超时时间加入配置文件(如果没有设置, 改值将设置为0);连接池属性文件编辑器 1.0.
    2004-12-13
    将原来的反复生成新数据库连接代理对象的模式修改为直接维护一个代理对象池, ConnectionPool 中维护一个 _Connection 的列表, 每个_Connection 保存一个原始的连接和经过代理的连接, 客户获取连接时就返回经过代理的连接(同时_Connection 也被移出闲置队列), 客户关闭连接时就将_Connection 返回闲置队列, 大大避免了反复生成新对象对 JVM 系统垃圾收集器所造成的负担;
    修正了使用微软驱动(com.microsoft.jdbc.sqlserver.SQLServerDriver)时发生 ClassCastException 的问题, 感谢 Raistlin(wjh_yu@hotmail.com) 提供了修改代码.
    2004-11-2
    增加了超时后自动关闭数据库连接(返回连接池)的方法, 代码参看 dbpool.ConnectionTimeoutChecker. 在连接没有被调用任何操作(调用类的方法)指定时间后自动关闭连接,
防止因为用户忘记关闭连接时引起的资源泄漏(这种情况经常发生在仓促的直接进行原型开发或者修改的时候). 默认超时时间: 15 分钟, 如果系统使用频繁, 应该适当缩减这个时间(目前没有实现在配置文件中修改这个属性, 请修改源代码)以防止大量连接等待自动释放造成系统过载.
    2004-10-2
    增加了一个在 JDK 1.3 及以上版本虚拟机关闭时尝试释放所有数据库连接的 JVM ShutDown Hook.
    
    兼容性测试: 目前在 Windows XP + JDK 1.4.2 下使用 ODBC, Oracle 9i, Microsoft SQL Server 2000, MySQL 4.13, DB2 测试未发现大故障. 如果您在其他系统/数据库下测试通过, 欢迎告诉作者.
    性能测试(仅供参考): 首先运行 odbcsetup.exe 安装测试数据库, Pentium(R) 4 CPU 2.40GHz, 512 MB 内存, 使用原始的 ODBC 驱动程序, sample.ConnPoolTest 1000 次读取操作总执行时间为 1718 毫秒.
 
    这里实现的程序基于一个网上常见的连接池程序修改而成. 很多的连接池都要求用户通过
其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据
库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者
显式的调用Connection.close()方法,而需要用其规定的一个方法来关闭连接。这种做法有
两个缺点:
    第一:改变了用户使用习惯,增加了用户的使用难度。使用者在用完数据库连接后通常是
直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句conn.close()
将被某些特定的语句所替代。
    第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用
连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么
连接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题
更容易出现。
    通过使用 Java 中的动态代理机制, 现在这个连接池取连接的时候还是旧的方法, 即通过
Connection conn = dbpool.DBConnectionManager.getInstance().getConnection("连接池名称");
来从给定连接池名称中获得一个新的连接, 但是关闭连接却可以直接调用 close() 方法即可,
:
conn.close();
即可把连接返回到连接池中去了, 同时该类的旧有的释放连接的方法
freeConnection(String name, Connection con)仍然有效.
         您可以查看 /WebModule/test.jsp  /src/sample/ConnPoolTest.java 来了解在 JSP
和普通 Java 类中的连接池的应用方法. 如果想在 JSP 中使用,  /classes 目录下的文件
复制到您的 JSP 程序的 WEB-INF/classes/ 下即可, 或者将 /archive/jdbc_conn_pool.jar 复制到
/WEB-INF/lib/ , 并在 WEB-INF/classes/ 下面建立 db.properties 文件.
         要在 Windows 平台下运行此程序, 请配置 ODBC 数据源(在控制面板中找)名称为 test,
选择数据库文件为 sql 目录下的 test.mdb 即可. 您也可以通过直接运行 odbcsetup.exe 来自动完成这一过程(能够生成反安装程序).
 
附录:
db.properties是一个属性文件,它包含定义连接池的键-值对。可供定义的公用属性如下:
 
drivers 以空格分隔的JDBC驱动程序类列表
logfile 日志文件的绝对路径
 
其它的属性和特定连接池相关,其属性名字前应加上连接池名字:
 
<poolname>.url 数据库的 JDBC URL
<poolname>.maxconn 允许建立的最大连接数,0表示没有限制
<poolname>.user 用于该连接池的数据库帐号
<poolname>.password 相应的密码
 
其中url属性是必需的,而其它属性则是可选的。数据库帐号和密码必须合法。
 
用于Windows平台的db.properties文件示例如下:
 
drivers=sun.jdbc.odbc.JdbcOdbcDriver oracle.jdbc.OracleDriver
logfile=D://pool_log.txt
 
oracle_pool.url=jdbc:oracle:thin:@127.0.0.1:1521:service_id
oracle_pool.maxconn=100
oracle_pool.user=scott
oracle_pool.password=tiger
 
access.url=jdbc:odbc:demo
access.user=demo
access.password=demopw
 
注意在Windows路径中的反斜杠必须输入2个,这是由于属性文件中的反斜杠同时也是一个转义字符。
 
这个文件定义了两个连接池: oracle_pool  access, 前面的连接到一个 Oracle 数据库, 后面的连接到 ODBC 数据库.
 
 
原创粉丝点击