目前市面上三個主流連接池從性能上排名如下:proxool>c3p0>dbcp,proxool還提供了可視化的連接池實時監控工具,所以既穩定又方便,配置也是非常容易的事情。下面我來講講我如何配置proxool連接池的。
1、下載相關資源。
從http://proxool.sourceforge.net/站點上下載我們需要的資源,proxool-0.9.1是最新版本,解壓后從lib下copy里面的2個JAR包 proxool-0.9.1.jar和
proxool-cglib.jar至項目中去。如果不加proxool-cglib.jar的話會報 java.lang.ClassNotFoundException:org.logicalcobwebs.cglib.proxy.Callback異常。
2、首先在WEB-INF目錄下新建一個proxool.xml文件。
- <?xml version="1.0" encoding="UTF-8"?>
- <proxool-config>
- <proxool>
- <alias>datasource1</alias>
- <driver-url>jdbc:mysql:
- <driver-class>com.mysql.jdbc.Driver</driver-class>
- <driver-properties>
- <property name="user" value="root" />
- <property name="password" value="root" />
- </driver-properties>
- <house-keeping-sleep-time>90000</house-keeping-sleep-time>
- <maximum-new-connections>20</maximum-new-connections>
- <prototype-count>5</prototype-count>
- <maximum-connection-count>1000</maximum-connection-count>
- <minimum-connection-count>10</minimum-connection-count>
- </proxool>
-
- <proxool>
- <alias>datasource2</alias>
- <driver-url>jdbc:sybase:Tds:localhost:16428/datasource2</driver-url>
- <driver-class>com.sybase.jdbc3.jdbc.SybDriver</driver-class>
- <driver-properties>
- <property name="user" value="dba" />
- <property name="password" value="dba" />
- </driver-properties>
- <house-keeping-sleep-time>90000</house-keeping-sleep-time>
- <maximum-new-connections>20</maximum-new-connections>
- <prototype-count>5</prototype-count>
- <maximum-connection-count>1000</maximum-connection-count>
- <minimum-connection-count>10</minimum-connection-count>
- </proxool>
- </proxool-config>
<?xml version="1.0" encoding="UTF-8"?>
<proxool-config>
<proxool>
<alias>datasource1</alias>
<driver-url>jdbc:mysql://localhost:3306/datasource1</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="root" />
<property name="password" value="root" />
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>20</maximum-new-connections>
<prototype-count>5</prototype-count>
<maximum-connection-count>1000</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
</proxool>
<proxool>
<alias>datasource2</alias>
<driver-url>jdbc:sybase:Tds:localhost:16428/datasource2</driver-url>
<driver-class>com.sybase.jdbc3.jdbc.SybDriver</driver-class>
<driver-properties>
<property name="user" value="dba" />
<property name="password" value="dba" />
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>20</maximum-new-connections>
<prototype-count>5</prototype-count>
<maximum-connection-count>1000</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
</proxool>
</proxool-config>
我在里面配置了2個不同數據庫的數據源,你可以根據需要配置多個,其中具體的參數屬性我會在下面全部予以說明。
3、配置web.xml文件。
- <?xml version="1.0" encoding="UTF-8" ?>
- <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <servlet>
- <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>
- <servlet>
- <servlet-name>datasource_situation</servlet-name>
- <servlet-class>
- org.logicalcobwebs.proxool.admin.servlet.AdminServlet
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>datasource_situation</servlet-name>
- <url-pattern>/datasource_situation</url-pattern>
- </servlet-mapping>
- <!-- 配置受保護域,只有Tomcat管理員才能察看連接池的信息 -->
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>proxool</web-resource-name>
- <url-pattern>/datasource_situation</url-pattern>
- </web-resource-collection>
- <auth-constraint>
- <role-name>manager</role-name>
- </auth-constraint>
- </security-constraint>
- <login-config>
- <auth-method>BASIC</auth-method>
- <realm-name>proxool manager Application</realm-name>
- </login-config>
- <security-role>
- <description>
- The role that is required to log in to the Manager
- Application
- </description>
- <role-name>manager</role-name>
- </security-role>
- <error-page>
- <error-code>401</error-code>
- <location>/401.jsp</location>
- </error-page>
- </web-app>
<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<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>
<servlet>
<servlet-name>datasource_situation</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>datasource_situation</servlet-name>
<url-pattern>/datasource_situation</url-pattern>
</servlet-mapping>
<!-- 配置受保護域,只有Tomcat管理員才能察看連接池的信息 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>proxool</web-resource-name>
<url-pattern>/datasource_situation</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>proxool manager Application</realm-name>
</login-config>
<security-role>
<description>
The role that is required to log in to the Manager
Application
</description>
<role-name>manager</role-name>
</security-role>
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
</web-app>
<load-on-startup>1</load-on-startup>用來設置加載屬性,一定要保證在其他配置項之前加載。
- <servlet>
- <servlet-name>datasource_situation</servlet-name>
- <servlet-class>
- org.logicalcobwebs.proxool.admin.servlet.AdminServlet
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>datasource_situation</servlet-name>
- <url-pattern>/datasource_situation</url-pattern>
- </servlet-mapping>
<servlet>
<servlet-name>datasource_situation</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>datasource_situation</servlet-name>
<url-pattern>/datasource_situation</url-pattern>
</servlet-mapping>
這個屬性是用來提供察看連接池信息的工具,既在域名后跟上/datasource_situation就可以查看了,當然名字可以自己定義。如果你想限制用戶和密碼來訪問就用
- <security-constraint>
- <web-resource-collection>
- <web-resource-name>proxool</web-resource-name>
- <url-pattern>/datasource_situation</url-pattern>
- </web-resource-collection>
- <auth-constraint>
- <role-name>manager</role-name>
- </auth-constraint>
- </security-constraint>
- <login-config>
- <auth-method>BASIC</auth-method>
- <realm-name>proxool manager Application</realm-name>
- </login-config>
- <security-role>
- <description>
- The role that is required to log in to the Manager
- Application
- </description>
- <role-name>manager</role-name>
- </security-role>
- <error-page>
- <error-code>401</error-code>
- <location>/401.jsp</location>
- </error-page>
<security-constraint>
<web-resource-collection>
<web-resource-name>proxool</web-resource-name>
<url-pattern>/datasource_situation</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>proxool manager Application</realm-name>
</login-config>
<security-role>
<description>
The role that is required to log in to the Manager
Application
</description>
<role-name>manager</role-name>
</security-role>
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
這段配置就限定了只有輸入了TOMCAT的管理員帳號密碼后就能登陸連接池查看工具了,如果連續三次登陸失敗,進入401.jsp頁面。401.jsp要加入下段代碼
response.setHeader("WWW-Authenticate", "Basic realm=\"Tomcat Manager Application\"");
4、配置連接池連接類。
package selfservice;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.ProxoolFacade;
import org.logicalcobwebs.proxool.admin.SnapshotIF;
public class PoolManager {
private static int activeCount = 0;
public PoolManager(){
}
/**
* 獲取連接
* getConnection
* @param name
* @return
*/
public Connection getConnection() {
try{
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");//proxool驅動類
Connection conn = DriverManager.getConnection("proxool.datasource1");
//此處的datasource1是在proxool.xml中配置的連接池別名,當然根據需要可以用datasource2
showSnapshotInfo();
return conn;
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
/**
* 此方法可以得到連接池的信息
* showSnapshotInfo
*/
private void showSnapshotInfo(){
try{
SnapshotIF snapshot = ProxoolFacade.getSnapshot("datasource1", true);
int curActiveCount=snapshot.getActiveConnectionCount();//獲得活動連接數
int availableCount=snapshot.getAvailableConnectionCount();//獲得可得到的連接數
int maxCount=snapshot.getMaximumConnectionCount() ;//獲得總連接數
if(curActiveCount!=activeCount)//當活動連接數變化時輸出的信息
{
System.out.println("活動連接數:"+curActiveCount+"(active) 可得到的連接數:"+availableCount+"(available) 總連接數:"+maxCount+"(max)");
activeCount=curActiveCount;
}
}catch(ProxoolException e){
e.printStackTrace();
}
}
/**
* 獲取連接
* getConnection
* @param name
* @return
*/
public Connection getConnection(String name){
return getConnection();
}
/**
* 釋放連接
* freeConnection
* @param conn
*/
public void freeConnection(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 釋放連接
* freeConnection
* @param name
* @param con
*/
public void freeConnection (String name,Connection con){
freeConnection(con);
}
public void getQuery() {
try {
Connection conn = getConnection();
if(conn != null){
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("select * from tblgxinterface");
int c = rs.getMetaData().getColumnCount();
while(rs.next()){
System.out.println();
for(int i=1;i<=c;i++){
System.out.print(rs.getObject(i));
}
}
rs.close();
}
freeConnection(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
測試成功!
下面我來介紹一下proxool.xml文件中關于proxool各個屬性的詳細說明:
fatal-sql-exception: 它是一個逗號分割的信息片段.當一個SQL異常發生時,他的異常信息將與這個信息片段進行比較.如果在片段中存在,那么這個異常將被認為是個致命錯誤(Fatal SQL Exception ).這種情況下,數據庫連接將要被放棄.無論發生什么,這個異常將會被重擲以提供給消費者.用戶最好自己配置一個不同的異常來拋出.
fatal-sql-exception-wrapper-class:正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,用戶可以包裝SQLException,使他變成另外一個異常.這個異常或者繼承SQLException或者繼承字RuntimeException.proxool自帶了2個實現:'org.logicalcobwebs.proxool.FatalSQLException' 和'org.logicalcobwebs.proxool.FatalRuntimeException' .后者更合適.
house-keeping-sleep-time: house keeper 保留線程處于睡眠狀態的最長時間,house keeper 的職責就是檢查各個連接的狀態,并判斷是否需要銷毀或者創建.
house-keeping-test-sql: 如果發現了空閑的數據庫連接.house keeper 將會用這個語句來測試.這個語句最好非常快的被執行.如果沒有定義,測試過程將會被忽略。
injectable-connection-interface: 允許proxool實現被代理的connection對象的方法.
injectable-statement-interface: 允許proxool實現被代理的Statement 對象方法.
injectable-prepared-statement-interface: 允許proxool實現被代理的PreparedStatement 對象方法.
injectable-callable-statement-interface: 允許proxool實現被代理的CallableStatement 對象方法.
jmx: 略
jmx-agent-id: 略
jndi-name: 數據源的名稱
maximum-active-time: 如果housekeeper 檢測到某個線程的活動時間大于這個數值.它將會殺掉這個線程.所以確認一下你的服務器的帶寬.然后定一個合適的值.默認是5分鐘.
maximum-connection-count: 最大的數據庫連接數.
maximum-connection-lifetime: 連接最大生命時間 默認4小時
minimum-connection-count: 最小的數據庫連接數
overload-without-refusal-lifetime: 略
prototype-count: 連接池中可用的連接數量.如果當前的連接池中的連接少于這個數值.新的連接將被建立(假設沒有超過最大可用數).例如.我們有3個活動連接2個可用連接,而我們的prototype-count是4,那么數據庫連接池將試圖建立另外2個連接.這和 minimum-connection-count不同. minimum-connection-count把活動的連接也計算在內.prototype-count 是spare connections 的數量.
recently-started-threshold: 略
simultaneous-build-throttle: 同時最大連接數
statistics: 連接池使用狀況統計。 參數“10s,1m,1d”
statistics-log-level: 日志統計跟蹤類型。 參數“ERROR”或 “INFO”
test-before-use: 略
test-after-use: 略
trace: 如果為true,那么每個被執行的SQL語句將會在執行期被log記錄(DEBUG LEVEL).你也可以注冊一個ConnectionListener (參看ProxoolFacade)得到這些信息.
verbose: 詳細信息設置。 參數 bool 值
提供一個附件,里面是proxool-0.9.1.jar和proxool-cglib.jar,歡迎下載試用。
posted on 2010-01-30 12:02
xzc 閱讀(1997)
評論(0) 編輯 收藏 所屬分類:
Spring 、
Java