1. 程式人生 > >資料庫連線池總結----Proxool

資料庫連線池總結----Proxool

一、為何需要 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. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE web-app
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  4. "/WEB-INF/dtds/web-app_2_3.dtd">
  5. <web-app>
  6. <display-name>proxool</display-name>
  7. <servlet>
  8. <servlet-name>Admin</servlet-name>
  9. <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
  10. </servlet>
  11. <servlet-mapping>
  12. <servlet-name>Admin</servlet-name
    >
  13. <url-pattern>/admin</url-pattern>
  14. </servlet-mapping>
  15. </web-app>



三、通過 ProxoolDriver 取得 connection

建立一個 jsp or DAO Bean, 通過 org.logicalcobwebs.proxool.ProxoolDriver 建立 Connection

test.jsp

  1. <%@pageimport="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. <?xmlversion="1.0"encoding="ISO-8859-1"?>
  2. <!-- the proxool configuration can be embedded within your own application's.
  3. Anything outside the "proxool" tag is ignored. -->
  4. <something-else-entirely>
  5. <proxool>
  6. <alias>xml-test</alias>
  7. <driver-url>jdbc:mysql://localhost:3306/test</driver-url>
  8. <driver-class>org.gjt.mm.mysql.Driver</driver-class>
  9. <driver-properties>
  10. <propertyname="user"value="root"/>
  11. <propertyname="password"value="password"/>
  12. </driver-properties>
  13. <maximum-connection-count>10</maximum-connection-count>
  14. <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  15. </proxool>
  16. </something-else-entirely>



也可以採用 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. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPE web-app
  3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  4. "/WEB-INF/dtds/web-app_2_3.dtd">
  5. <web-app>
  6. <display-name>proxool</display-name>
  7. <servlet>
  8. <servlet-name>ServletConfigurator</servlet-name>
  9. <servlet-class>
  10. org.logicalcobwebs.proxool.configuration.ServletConfigurator
  11. </servlet-class>
  12. <init-param>
  13. <param-name>xmlFile</param-name>
  14. <param-value>WEB-INF/proxool.xml</param-value>
  15. </init-param>
  16. <load-on-startup>1</load-on-startup>
  17. </servlet>
  18. <servlet>
  19. <servlet-name>Admin</servlet-name>
  20. <servlet-class>
  21. org.logicalcobwebs.proxool.admin.servlet.AdminServlet
  22. </servlet-class>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>Admin</servlet-name>
  26. <url-pattern>/admin</url-pattern>
  27. </servlet-mapping>
  28. </web-app>



在程式中, 只需要利用到別名就可以呼叫 connection pool 裡面的 connection 來使用了

  1. <%@pageimport="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. <?xmlversion="1.0"encoding="ISO-8859-1"?>
  2. <something-else-entirely>
  3. <proxool>
  4. <alias>example</alias>
  5. <driver-url>jdbc:mysql://localhost:3306/GUESTBOOK</driver-url>
  6. <driver-class>com.mysql.jdbc.Driver</driver-class>
  7. <driver-properties>
  8. <propertyname="user"value="caterpillar"/>
  9. <propertyname="password"value="123456"/>
  10. </driver-properties>
  11. <maximum-connection-count>10</maximum-connection-count><house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  12. </proxool>
  13. </something-else-entirely>



 其中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");