目前市面上三個主流連接池從性能上排名如下:proxool>c3p0>dbcp,,proxool還提供了可視化的連接池實時監(jiān)控工具,,所以既穩(wěn)定又方便,配置也是非常容易的事情,。下面我來講講我如何配置proxool連接池的。
1、下載相關(guān)資源,。
從http://proxool./站點上下載我們需要的資源,,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個不同數(shù)據(jù)庫的數(shù)據(jù)源,你可以根據(jù)需要配置多個,,其中具體的參數(shù)屬性我會在下面全部予以說明,。
3、配置web.xml文件,。
- <?xml version="1.0" encoding="UTF-8" ?>
- <web-app version="2.5" xmlns="http://java./xml/ns/javaee"
- xmlns:xsi="http://www./2001/XMLSchema-instance"
- xsi:schemaLocation="http://java./xml/ns/javaee http://java./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./xml/ns/javaee"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://java./xml/ns/javaee http://java./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>用來設(shè)置加載屬性,,一定要保證在其他配置項之前加載,。
- <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的管理員賬號密碼后就能登陸連接池查看工具了,如果連續(xù)三次登陸失敗,,進入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驅(qū)動類
Connection conn = DriverManager.getConnection("proxool.datasource1");
//此處的datasource1是在proxool.xml中配置的連接池別名,當然根據(jù)需要可以用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();//獲得活動連接數(shù)
int availableCount=snapshot.getAvailableConnectionCount();//獲得可得到的連接數(shù)
int maxCount=snapshot.getMaximumConnectionCount() ;//獲得總連接數(shù)
if(curActiveCount!=activeCount)//當活動連接數(shù)變化時輸出的信息
{
System.out.println("活動連接數(shù):"+curActiveCount+"(active) 可得到的連接數(shù):"+availableCount+"(available) 總連接數(shù):"+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文件中關(guān)于proxool各個屬性的詳細說明:
fatal-sql-exception:
它是一個逗號分割的信息片段.當一個SQL異常發(fā)生時,他的異常信息將與這個信息片段進行比較.如果在片段中存在,那么這個異常將被認為是個致命錯誤
(Fatal SQL Exception
).這種情況下,數(shù)據(jù)庫連接將要被放棄.無論發(fā)生什么,這個異常將會被重擲以提供給消費者.用戶最好自己配置一個不同的異常來拋出.
fatal-sql-exception-wrapper-class:正如上面所說,你最好配置一個不同的異常來重擲.利用這個屬性,用戶可以包裝SQLException,使他變成另外一個異常.這個異?;蛘呃^承SQLException或者繼承字RuntimeException.proxool自帶了2個實現(xiàn):'org.logicalcobwebs.proxool.FatalSQLException' 和'org.logicalcobwebs.proxool.FatalRuntimeException' .后者更合適.
house-keeping-sleep-time: house keeper 保留線程處于睡眠狀態(tài)的最長時間,house keeper 的職責就是檢查各個連接的狀態(tài),并判斷是否需要銷毀或者創(chuàng)建.
house-keeping-test-sql: 如果發(fā)現(xiàn)了空閑的數(shù)據(jù)庫連接.house keeper 將會用這個語句來測試.這個語句最好非常快的被執(zhí)行.如果沒有定義,測試過程將會被忽略,。
injectable-connection-interface: 允許proxool實現(xiàn)被代理的connection對象的方法.
injectable-statement-interface: 允許proxool實現(xiàn)被代理的Statement 對象方法.
injectable-prepared-statement-interface: 允許proxool實現(xiàn)被代理的PreparedStatement 對象方法.
injectable-callable-statement-interface: 允許proxool實現(xiàn)被代理的CallableStatement 對象方法.
jmx: 略
jmx-agent-id: 略
jndi-name: 數(shù)據(jù)源的名稱
maximum-active-time: 如果housekeeper 檢測到某個線程的活動時間大于這個數(shù)值.它將會殺掉這個線程.所以確認一下你的服務(wù)器的帶寬.然后定一個合適的值.默認是5分鐘.
maximum-connection-count: 最大的數(shù)據(jù)庫連接數(shù).
maximum-connection-lifetime: 連接最大生命時間 默認4小時
minimum-connection-count: 最小的數(shù)據(jù)庫連接數(shù)
overload-without-refusal-lifetime: 略
prototype-count:
連接池中可用的連接數(shù)量.如果當前的連接池中的連接少于這個數(shù)值.新的連接將被建立(假設(shè)沒有超過最大可用數(shù)).例如.我們有3個活動連接2個可用連接,
而我們的prototype-count是4,那么數(shù)據(jù)庫連接池將試圖建立另外2個連接.這和 minimum-connection-count不同.
minimum-connection-count把活動的連接也計算在內(nèi).prototype-count 是spare connections
的數(shù)量.
recently-started-threshold: 略
simultaneous-build-throttle: 同時最大連接數(shù)
statistics: 連接池使用狀況統(tǒng)計,。 參數(shù)“10s,1m,1d”
statistics-log-level: 日志統(tǒng)計跟蹤類型,。 參數(shù)“ERROR”或 “INFO”
test-before-use: 略
test-after-use: 略
trace: 如果為true,那么每個被執(zhí)行的SQL語句將會在執(zhí)行期被log記錄(DEBUG LEVEL).你也可以注冊一個ConnectionListener (參看ProxoolFacade)得到這些信息.
verbose: 詳細信息設(shè)置。 參數(shù) bool 值
提供一個附件,,里面是proxool-0.9.1.jar和proxool-cglib.jar,,歡迎下載試用。