作為開源的連接池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用戶指南。