proxool連接池

作爲開源的連接池Proxool
有以下優點。
透明性 可以明的添加接連池而不影響你原來的項目的JDBC代碼;
開放性 你可以方便的與其它的開源產品進行整合。如hibernate 中自帶的這個Proxool
標準性 它是在J2SE下開出來的。你可以放心的開發
易用性 非常容易 的進行配置。
proxool是一個非常強大的連接池工具包,我覺得相比dbcp、c3p0這兩個連接池包都要好用,我用loadrunner測試過,這三個連接池的從性能上排名如下:proxool>c3p0>dbcp,特別是dbcp在大併發的情況下總是出現各種異常。

下面是實現proxool的幾種方式:

JDBC連接方法:
首先建一個proxool的配置文件proxool.xml

proxool.xml 代碼
xml 代碼

<!--sp-->xml version="1.0" encoding="UTF-8"?>

<!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. -->

<something-else-entirely>
<proxool>
<!--連接池的別名-->
<alias>DBPool</alias>
<!--proxool只能管理由自己產生的連接-->
<driver-url>jdbc:oracle:thin:@192.168.0.40:1521:drcom</driver-url>
<!--JDBC驅動程序-->
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="drcom"/>
<property name="password" value="drcom"/>
</driver-properties>
<!-- proxool自動偵察各個連接狀態的時間間隔(毫秒),偵察到空閒的連接就馬上回收,超時的銷燬-->
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<!-- 指因未有空閒連接可以分配而在隊列中等候的最大請求數,超過這個請求數的用戶連接就不會被接受-->
<maximum-new-connections>150</maximum-new-connections>
<!-- 最少保持的空閒連接數-->
<prototype-count>3</prototype-count>
<!-- 允許最大連接數,超過了這個連接,再有請求時,就排在隊列中等候,最大的等待請求數由maximum-new-connections決定-->
<maximum-connection-count>100</maximum-connection-count>
<!-- 最小連接數-->
<minimum-connection-count>3</minimum-connection-count>
</proxool>
</something-else-entirely>

再在web.xml中進行配置,其中的ServletConfigurator是裝載WEB-INF目錄下的proxool.xml,並設置爲Tomcat啓動時就加載。Admin這個Servlet是proxool提供的察看連接池的信息的工具,


web.xml 代碼
xml 代碼

<servlet>
<servlet-name>proxoolServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/config/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- proxool提供的管理監控工具,可查看當前數據庫連接情況。如果運行不成功,請刪除本行 -->
<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>


以上配置完成後,第三步就可以創建一個連接池的類了


java 代碼

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.DBPool");
//此處的DBPool是在proxool.xml中配置的連接池別名
showSnapshotInfo();

return conn;
}catch(Exception ex){
ex.printStackTrace();
}
return null;
}
/**
* 此方法可以得到連接池的信息
* showSnapshotInfo
*/
private void showSnapshotInfo(){
try{
SnapshotIF snapshot = ProxoolFacade.getSnapshot("DBPool", 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的連接池我用loadrunner進行大併發的測試,性能還是很好的。

Hibernate中proxool連接池的方式:

首先步驟跟JDBC的連接池一樣,也是新建一個proxool.xml配置文件,再在web.xml中配置,具體參考上面。
第二步在hibernate的配置文件hibernate.cfg.xml中配置proxool連接設置:


hibernate.cfg.xml代碼
xml 代碼

<?xmlversion='1.0'encoding='UTF-8'?>

<!DOCTYPEhibernate-configurationPUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

<property name="hibernate.proxool.pool_alias">DBPool</property>

<property name="hibernate.proxool.xml">Proxool.xml</property>

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="connection.driver_class">com.mysql.jdbc.Driver</property>

<mappin gresource="hibernate.cfg.xml"/>

這裏放Hibernate的映射文件

</session-factory>



Spring中proxool連接池的方式:

首先布驟與JDBC的連接池一樣,先建一個proxool.xml配置文件,再在web.xml中配置,具體參考上面的。
第二步在spring配置文件applicationContext.xml中配置proxool連接設置

applicationContext.xml代碼
xml 代碼

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" singleton="true">
<property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/>
<property name="url" value="proxool.StatDBPool"/>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>


這樣spring就能得到一個dataSource的數據源。


proxool還有很多功能,我這只是簡單的應用。具體請察看proxool用戶指南。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章