作为开源的连接池Proxool 有以下优点:
透明性   可以明的添加接连池而不影响你原来的项目的JDBC代码;

开放性 你可以方便的与其它的开源产品进行整合。如hibernate  中自带的这个Proxool

标准性 它是在J2SE下开出来的。你可以放心的开发;

易用性  非常容易 的进行配置。

proxool 是一个非常强大的连接池工具包,我觉得相比dbcp、c3p0这两个连接池包都要好用,我用loadrunner测试过,这三个连接池的从性能上排名如 下:proxool>c3p0>dbcp,特别是dbcp在大并发的情况下总是出现各种异常。

下面是实现proxool的几种方式:

JDBC连接方法:

首先建一个proxool的配置文件proxool.xml

proxool.xml 代码
XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>      
  2.     
  3. <!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. -->      
  4.     
  5. <something-else-entirely>    
  6.     <proxool>    
  7.         <!--连接池的别名-->    
  8.         <alias>DBPool</alias>    
  9.         <!--proxool只能管理由自己产生的连接-->    
  10.         <driver-url>jdbc:oracle:thin:@192.168.0.40:1521:drcom</driver-url>    
  11.         <!--JDBC驱动程序-->    
  12.         <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>    
  13.         <driver-properties>    
  14.             <property name="user" value="drcom"/>    
  15.             <property name="password" value="drcom"/>    
  16.         </driver-properties>    
  17.         <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->    
  18.         <house-keeping-sleep-time>90000</house-keeping-sleep-time>    
  19.         <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->      
  20.         <maximum-new-connections>150</maximum-new-connections>    
  21.         <!-- 最少保持的空闲连接数-->      
  22.         <prototype-count>3</prototype-count>    
  23.         <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->      
  24.         <maximum-connection-count>100</maximum-connection-count>    
  25.         <!-- 最小连接数-->    
  26.         <minimum-connection-count>3</minimum-connection-count>    
  27.     </proxool>    
  28. </something-else-entirely>    

再在web.xml中进行配置,其中的ServletConfigurator是装载WEB-INF目录下的proxool.xml,并设置为Tomcat启动时就加载。Admin这个Servlet是proxool提供的察看连接池的信息的工具:

web.xml 代码

XML/HTML代码
  1. <?xml version="1.0" encoding="UTF-8"?>    
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"    
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee      
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">    
  6.     <servlet>    
  7.         <servlet-name>ServletConfigurator</servlet-name>    
  8.         <servlet-class>    
  9.             org.logicalcobwebs.proxool.configuration.ServletConfigurator      
  10.         </servlet-class>    
  11.         <init-param>    
  12.             <param-name>xml</Fileparam-name>    
  13.             <param-value>WEB-INF/proxool.xml</param-value>    
  14.         </init-param>    
  15.         <load-on-startup>1</load-on-startup>    
  16.     </servlet>    
  17.     <servlet>    
  18.         <servlet-name>Admin</servlet-name>    
  19.         <servlet-class>    
  20.             org.logicalcobwebs.proxool.admin.servlet.AdminServlet      
  21.         </servlet-class>    
  22.     </servlet>    
  23.     <servlet-mapping>    
  24.         <servlet-name>Adminservlet-name>    
  25.         <url-pattern>/adminurl-pattern>    
  26.     </servlet-mapping>    
  27.     <servlet>    
  28.         <servlet-name>TestServlet</servlet-name>    
  29.         <servlet-class>    
  30.             selfservice.TestServlet      
  31.         </servlet-class>    
  32.     </servlet>    
  33.     <servlet-mapping>    
  34.         <servlet-name>TestServlet</servlet-name>    
  35.         <url-pattern>/TestServlet</url-pattern>    
  36.     </servlet-mapping>    
  37. </web-app>  
以上配置完成后,第三步就可以创建一个连接池的类了

ActionScript/Java代码
  1. java 代码  
  2.   
  3. package selfservice;          
  4.         
  5. import java.sql.Connection;          
  6. import java.sql.DriverManager;          
  7. import java.sql.ResultSet;          
  8. import java.sql.SQLException;          
  9. import java.sql.Statement;          
  10.         
  11. import org.logicalcobwebs.proxool.ProxoolException;          
  12. import org.logicalcobwebs.proxool.ProxoolFacade;          
  13. import org.logicalcobwebs.proxool.admin.SnapshotIF;          
  14.         
  15.         
  16. public class PoolManager {          
  17.               
  18.     private static int activeCount = 0;          
  19.               
  20.               
  21.     public PoolManager(){          
  22.                   
  23.     }            
  24.     /**       
  25.      * 获取连接       
  26.      * getConnection       
  27.      * @param name       
  28.      * @return       
  29.      */        
  30.     public Connection getConnection() {          
  31.         try{          
  32.             Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");//proxool驱动类          
  33.             Connection conn = DriverManager.getConnection("proxool.DBPool");      
  34.            //此处的DBPool是在proxool.xml中配置的连接池别名        
  35.             showSnapshotInfo();          
  36.                       
  37.             return conn;          
  38.         }catch(Exception ex){          
  39.             ex.printStackTrace();          
  40.         }          
  41.         return null;          
  42.     }          
  43.     /**       
  44.      * 此方法可以得到连接池的信息       
  45.      * showSnapshotInfo       
  46.      */        
  47.     private void showSnapshotInfo(){          
  48.         try{          
  49.             SnapshotIF snapshot = ProxoolFacade.getSnapshot("DBPool"true);          
  50.             int curActiveCount=snapshot.getActiveConnectionCount();//获得活动连接数          
  51.             int availableCount=snapshot.getAvailableConnectionCount();//获得可得到的连接数          
  52.             int maxCount=snapshot.getMaximumConnectionCount() ;//获得总连接数          
  53.             if(curActiveCount!=activeCount)//当活动连接数变化时输出的信息          
  54.             {          
  55.              System.out.println("活动连接数:"+curActiveCount+"(active)  可得到的连接数:"+availableCount+"(available)  总连接数:"+maxCount+" (max)");                      
  56.              activeCount=curActiveCount;          
  57.             }          
  58.         }catch(ProxoolException e){          
  59.             e.printStackTrace();          
  60.         }          
  61.     }          
  62.     /**       
  63.      * 获取连接       
  64.      * getConnection       
  65.      * @param name       
  66.      * @return       
  67.      */        
  68.     public Connection getConnection(String name){          
  69.         return getConnection();          
  70.     }          
  71.     /**       
  72.      * 释放连接       
  73.      * freeConnection       
  74.      * @param conn       
  75.      */        
  76.     public void freeConnection(Connection conn){          
  77.         if(conn!=null){          
  78.             try {          
  79.                 conn.close();          
  80.             } catch (SQLException e) {                        
  81.                 e.printStackTrace();          
  82.             }          
  83.         }          
  84.     }          
  85.     /**       
  86.      * 释放连接       
  87.      * freeConnection       
  88.      * @param name       
  89.      * @param con       
  90.      */        
  91.     public void freeConnection (String name,Connection con){          
  92.         freeConnection(con);          
  93.     }          
  94.               
  95.     public void getQuery() {                  
  96.         try {          
  97.             Connection conn = getConnection();          
  98.             if(conn != null){          
  99.                 Statement statement = conn.createStatement();          
  100.                 ResultSet rs = statement.executeQuery("select * from tblgxinterface");          
  101.                 int c = rs.getMetaData().getColumnCount();          
  102.                 while(rs.next()){                            
  103.                     System.out.println();          
  104.                     for(int i=1;i<=c;i++){          
  105.                         System.out.print(rs.getObject(i));          
  106.                     }          
  107.                 }          
  108.                 rs.close();          
  109.             }          
  110.             freeConnection(conn);          
  111.         } catch (SQLException e) {                    
  112.             e.printStackTrace();          
  113.         }          
  114.         
  115.     }          
  116.         
  117. }        
就这样我们完成了一个连接池的功能。proxool的连接池我用loadrunner进行大并发的测试,性能还是很好的。

Hibernate中proxool连接池的方式:

首先步骤跟JDBC的连接池一样,也是新建一个proxool.xml配置文件,再在web.xml中配置,具体参考上面。

第二步在hibernate的配置文件hibernate.cfg.xml中配置proxool连接设置:


hibernate.cfg.xml代码

XML/HTML代码
  1. <property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>   
  2.             <property name="hibernate.proxool.pool_alias">DBPool</property>   
  3.             <property name="hibernate.proxool.xml">proxool.xml</property>    

Spring中proxool连接池的方式:

首先布骤与JDBC的连接池一样,先建一个proxool.xml配置文件,再在web.xml中配置,具体参考上面的。

第二步在spring配置文件applicationContext.xml中配置proxool连接设置

applicationContext.xml代码

XML/HTML代码
  1. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" singleton="true">   
  2.         <property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver"/>   
  3.         <property name="url" value="proxool.StatDBPool"/>   
  4.     </bean>   
  5.     <bean id="transactionManager"     
  6.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
  7.         <property name="dataSource">   
  8.             <ref local="dataSource" />   
  9.         </property>   
  10.     </bean>    
这样spring就能得到一个dataSource的数据源。

proxool还有很多功能,我这只是简单的应用。

具体请察看proxool用户指南。

来自JavaWorld的资料:http://www.javaworld.com.tw/confluence/display/opensrc/Proxool

如果您复制代码的时候,也包含了行号,可用UltraEdit-32处理一下,非常方便。