那些年被听错的歌词:数据库连接池总结proxcool

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 21:52:34
一、为何需要 connection pooling

当我们进入了 Java 的开发世界, pool 也是一门学问, 如何让 connection 先建立好与 DB 的连结, 后来的人可以使用已经存在于 pool 的 connection, 减少连结的时间, 这么优秀的功能, 在许多 application server 都已经实现好了, 你只要简单地按照说明文件配置, 包括最大连结数量, 初始连结数量, 最大等待数量等等的参数, 当然, Tomcat 也有内建 commons-dbcp 相关的 connection pooling 机制, 请查阅 Tomcat JNDI Datasource 设定!!

而 proxool 是一个强大的 connection pooling 项目, 兼容于 jdk 1.3 以及 1.4. 也已经实现了 监控, 纪录等等的功能, 对于一个有限制 connection 数量, 及注重 performation 的项目来说, 是一套非常完整的解决方案.

下载区:http://sourceforge.net/projects/proxool/

二、设置 AdminServlet

首先, 你要把下载 proxool 的 lib 下面所有的 jar 文件, 放到 WEB-INF/lib 下面,

另外, 把你的 jdbc driver 也放到相同的 lib,

接著就是配置 /WEB-INF/web.xml

web.xml
  1. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  2. "/WEB-INF/dtds/web-app_2_3.dtd">
  3. proxool
  4. Admin
  5. org.logicalcobwebs.proxool.admin.servlet.AdminServlet
  6. Admin
  7. /admin


三、通过 ProxoolDriver 取得 connection

建立一个 jsp or DAO Bean, 通过 org.logicalcobwebs.proxool.ProxoolDriver 建立 Connection

test.jsp
  1. <%@page import="java.sql.*"%>
  2. <%
  3. Connection connection = null;
  4. try {
  5. Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
  6. connection = DriverManager.getConnection(
  7. "proxool.test:org.gjt.mm.mysql.Driver:jdbc:mysql://localhost:3306/test",
  8. "root",
  9. "password"
  10. );
  11. } catch (Exception e) {
  12. out.println(e)
  13. }
  14. out.println("OK");
  15. %>


四、检视 pooling 现在状态

执行 http://localhost:8080/proxool-test/admin ( proxool-test 是你的应用名称 ) 如果没有任何 pool 状态的时候, 你只会看到 Pools 这几个字, 所以你先执行 http://localhost:8080/proxool-test/test.jsp 建立一个 connection, 就可以监控 connection pooling 的状态了.

Pools > test -> jdbc:mysql://www:3306/test

Defintition for test URL jdbc:mysql://localhost:3306/test
Driver org.gjt.mm.mysql.Driver
Connections 0 (min), 15 (max)
Prototyping off
Connection Lifetime 11:00:00
Maximum active time 07:05:00
House keeping sleep time 30s
House keeping test SQL off
Fatal SQL exceptions off
Statistics off

Snapshot at 21:12:53 Start date 01-??-2003 21:12:30
Connections 1 (active), 0 (available), 15 (max)


Served 1
Refused 0
Details # born last
start lap
(ms) thread
1 21:12:31 21:12:31 22432 Thread-15

less information

Proxool 0.7.2 (29-Apr-2003 00:33)

五、使用 properties 或者 xml 来设置 DB URL 及 Driver


可以采用 xml 配置文件, 在程序中使用 JAXPConfigurator.configure("proxool.xml", false); 配置文件设置如下

WEB-INF/proxool.xml
  1. xml-test
  2. jdbc:mysql://localhost:3306/test
  3. org.gjt.mm.mysql.Driver
  4. 10
  5. select CURRENT_DATE


也可以采用 properties, 在程序 PropertyConfigurator.configure("proxool.properties"); 文件设置

WEB-INF/proxool.properties
jdbc-0.proxool.alias=property-test
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/test
jdbc-0.proxool.driver-class=org.gjt.mm.mysql.Driver
jdbc-0.user=root
jdbc-0.password=password
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE

如果在 Web 使用, 在 web.xml 也可以设置 ServletConfigurator Servlet 来注册
  1. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  2. "/WEB-INF/dtds/web-app_2_3.dtd">
  3. proxool
  4. ServletConfigurator
  5. org.logicalcobwebs.proxool.configuration.ServletConfigurator
  6. xmlFile
  7. WEB-INF/proxool.xml
  8. 1
  9. Admin
  10. org.logicalcobwebs.proxool.admin.servlet.AdminServlet
  11. Admin
  12. /admin


在程序中, 只需要利用到别名就可以呼叫 connection pool 里面的 connection 来使用了
  1. <%@page import="java.sql.*;"%>
  2. <%
  3. Connection connection = null;
  4. try {
  5. Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
  6. connection = DriverManager.getConnection("proxool.xml-test");
  7. } catch (Exception e) {
  8. out.println(e);
  9. }
  10. out.println("ok");
  11. %> 


六、使用 connection.close() 关闭 connection

  以上的范例都没有写 close, 希望大家在 connection 做完之后记得使用 close() 来关闭, 将 connection 还到 pool , 以免有 java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: ConnectionCount is 10. Maximum connection count of 10 cannot be exceeded. 的现象发生.

Proxool - 组态设定
 Proxool 提供许多方式可以设定相关的参数,这边先介绍三种,另外还可以直接在Web应用程式中进行设定的方法,这在下一个主题中再说明。
 可以直接在Java程式中使用java.util.Properties设定,例如:

Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
Properties info = new Properties();
info.setProperty("proxool.maximum-connection-count", "20");
info.setProperty("proxool.house-keeping-test-sql", "select CURRENT_DATE");
info.setProperty("user", "caterpillar");
info.setProperty("password", "123456");
Connection conn = DriverManager.getConnection("proxool.example:com.mysql.jdbc.Driver:jdbc:mysql://localhost:3306/GUESTBOOK", info);


 当然这种方式是硬编码(hard code)在程式中,要改变参数时必须修改原始档案并重新编译,我们也可以使用XML档案或属性档来进行设定,使用XML档案的方式如下:
proxool.xml
  1.   
  2.     
  3. example
  4. jdbc:mysql://localhost:3306/GUESTBOOK
  5. com.mysql.jdbc.Driver
  6. 10
    select CURRENT_DATE


 其中example是连接池的别名(Alias),我们使用org.logicalcobwebs.proxool.configuration.JAXPConfigurator来读取XML,以下的示范如何取得连线:

Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
JAXPConfigurator.configure("proxool.xml", false); // false 表示不验证
XMLConnection conn = DriverManager.getConnection("proxool.example");


 我们也可以使用属性档来配置Proxool,属性档的内容如下:
proxool.properties

jdbc-0.proxool.alias=example
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/GUESTBOOK
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.user=caterpillar
jdbc-0.password=123456
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE


 我们使用org.logicalcobwebs.proxool.configuration.PropertyConfigurator来读取属性档,下面示范如何取得连线:

Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
org.logicalcobwebs.proxool.configuration.PropertyConfigurator.configure("proxool.properties");
Connection conn = DriverManager.getConnection("proxool.example");