Proxool 是一個開放原始碼的連線池管理套件,在使用與設定上都十分的方便,撰寫此文的同時,Proxool 最新的版本是0.8.3,您可以在以下的網址下載:
http://proxool.sourceforge.net/index.html
網站上的User Guide提供相當簡明的入門文件,您可以直接先從這些文件開始下手,而這篇文件則先提供您一個快速入門的範例,讓您知道如何透過Proxool取得資料庫連線,這邊所使用的是MySQL資料庫。
為了要使用Java來進行連線,首先您所需要的是當然是JDBC驅動程式,如果您不知道如何使用JDBC,請先參考這邊有關於JDBC的介紹:
http://www.caterpillar.onlyfun.net/phpBB2/viewforum.php?f=21
接下來請在Proxool網址上取得proxool-0.8.3.zip這個檔案,解開後,將lib下的proxool-0.8.3.jar放至您的 CLASSPATH可以存取的位置,如果是Web應用程式的話,您可以放置在WEB/lib目錄下,如果是桌面應用程式,您可以將之加入環境變數 CLASSPATH中。
要使用Proxool,首先是載入Proxool驅動程式:
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
接著我們在透過DriverManager取得連線時,必須告知連接池別名、JDBC驅動程式、JDBC URL等相關訊息:
Connection conn =
DriverManager.getConnection("proxool.example:com.mysql.jdbc.Driver:jdbc:mysql://localhost:3306/GUESTBOOK",
"caterpillar",
"123456");
其中example是連接池的別名(alias),是一個用來參考至連接池的名稱,取得連接,接下來就按照JDBC的操作來使用即可,在不使用連線的時候,可以關閉它將連線放回連接池。
下面這個程式是個簡單測試Proxool連線取得的範例:
import java.sql.*;
public class DBTest {
static {
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
}
catch(ClassNotFoundException e) {
System.out.println("找不到驅動程式類別");
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
Connection conn = DriverManager.getConnection(
"proxool.example:com.mysql.jdbc.Driver:jdbc:mysql://localhost:3306/GUESTBOOK",
"caterpillar", "123456");
if(!conn.isClosed())
System.out.println("資料庫連線測試成功!");
conn.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
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檔案的方式如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<something-else-entirely>
<proxool>
<alias>example</alias>
<driver-url>jdbc:mysql://localhost:3306/GUESTBOOK</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="caterpillar"/>
<property name="password" value="123456"/>
</driver-properties>
<maximum-connection-count>10</maximum-connection-count>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
</something-else-entirely>
其中example是連接池的別名(Alias),我們使用org.logicalcobwebs.proxool.configuration.JAXPConfigurator來讀取XML,以下的示範如何取得連線:
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
JAXPConfigurator.configure("proxool.xml", false); // false 表示不驗證 XML
Connection conn = DriverManager.getConnection("proxool.example");
我們也可以使用屬性檔來配置Proxool,屬性檔的內容如下:
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");
除了直接使用JAXPConfigurator從XML或屬性檔讀取組態設定之外,如果您正在運行Web 應用程式,您可以透過org.logicalcobwebs.proxool.configuration.ServletConfigurator,將之設定為Servlet,並於Container一啟始時就載入Proxool以初始連接池,要這麼作,請將proxool-0.8.3.jar放到 WEB/lib目錄中。
使用ServletConfigurator時,您有三種方式可以設定相關參數給它,透過XML、透過屬性檔、透過設定Servlet初始參數。
首先是透過XML檔案,XML檔案的設定請參考前一個主題,在web.xml中,您可以這麼設定:
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
再來是透過屬性檔,屬性檔的設定請參考前一個主題,在web.xml中,您可以這麼設定:
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/proxool.properties</param-value>
</init-param>
</servlet>
上面兩種作法,其實ServletConfigurator也各是委託JAXPConfigurator或PropertyConfigurator來讀取組態設定;您也可以不透過檔案設定組態,而直接在web.xml中透過Servlet初始參數的設定來指定相關參數:
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>jdbc-0.proxool.alias</param-name>
<param-value>example</param-value>
</init-param>
<init-param>
<param-name>jdbc-0.proxool.driver-url</param-name>
<param-value>jdbc:mysql://localhost:3306/GUESTBOOK</param-value>
</init-param>
<init-param>
<param-name>jdbc-0.proxool.driver-class</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>jdbc-0.user</param-name>
<param-value>caterpillar</param-value>
</init-param>
<init-param>
<param-name>jdbc-0.password</param-name>
<param-value>123456</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
取得連線的方式只要下面這句就行了:
Connection conn = DriverManager.getConnection("proxool.example");
下面這個JSP簡單的測試一下是否可以取得連線:
<%@page import="java.sql.*"%>
<%@page contentType="text/html;charset=Big5"%>
<%
try {
Connection conn = DriverManager.getConnection("proxool.example");
if(!conn.isClosed())
out.println("資料庫連線測試成功!");
conn.close();
}
catch(SQLException e) {
out.println(e.toString());
}
%>
Proxool 提供了一些方法可以讓您取得連線池的相關統計資料,例如您可以使用org.logicalcobwebs.proxool.admin.SnapshotIF來取得連線池目前使用狀態的資訊:
SnapshotIF snapshot = ProxoolFacade.getSnapshot("example", true);
System.out.println(snapshot.getActiveConnectionCount());
System.out.println(snapshot.getMaximumConnectionCount());
....
true 表示取得詳細的連線池訊息;您也可以對連線池的資料進行定時統計,這必須在XML或屬性檔中設定統計的時間,例如在XML中增加以下內容:
<proxool>
....
<statistics>1m,15m,1d</statistics>
</proxool>
統計的時隔可以分為s(econds),、m(inutes)、h(ours)與d(ays),就上面的設定來說,就是依分鐘、五分鐘、一天分別作統計,如果是在屬性檔案中設定,則增加:
jdbc-0.proxool.statistics=1m,15m,1d
如果要取得統計資訊,可以從org.logicalcobwebs.proxool.admin.StatisticsIF取得,例如取得所有的統計資料:
StatisticsIF[] statisticsArray = ProxoolFacade.getStatistics("example");
接下來就可以使用StatisticsIF的getXXX()方法來取得相關的訊息,您也可以指定取回某個時間的統計資訊,例如每15分鐘的統計資料:
StatisticsIF statistics = ProxoolFacade.getStatistics("example", "15m");
如果您使用Web應用程式,則可以直接利用org.logicalcobwebs.proxool.admin.servlet.AdminServlet來取得相關的統計資料,在web.xml中這麼設定:
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
啟動Container,在測試資料庫後,您就可以連接Servlet取得連線統計訊息,例如:
http://網址/Web程式名稱/admin