Proxool - 快速入門

在資料庫應用程式中,資料庫連線的取得是一個耗費時間的動作,為了避免花費時間在連線的取得與關閉上,我們會將連線資源放置在一個池中,有需要連線時就從池中取得,不需要連線時就將之放回池中,以求重複利用連線,連線池也擔任連線數量、連線時間的控制等等動作。

 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連線取得的範例:

DBTest.java
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檔案的方式如下:

proxool.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,屬性檔的內容如下:

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

除了直接使用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中,您可以這麼設定:

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中,您可以這麼設定:

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初始參數的設定來指定相關參數:

web.xml
<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.xml
<proxool>
     ....
    <statistics>1m,15m,1d</statistics>
</proxool>

 統計的時隔可以分為s(econds),、m(inutes)、h(ours)與d(ays),就上面的設定來說,就是依分鐘、五分鐘、一天分別作統計,如果是在屬性檔案中設定,則增加:

proxool.properties
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中這麼設定:

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值