proxool连接池的实现2

作为开源的连接池Proxool有以下优点
透明性   可以明的添加接连池而不影响你原来的项目的JDBC代码;
开放性 你可以方便的与其它的开源产品进行整合。如hibernate  中自带的这个Proxool
标准性 它是在J2SE下开出来的。你可以放心的开发
易用性  非常容易 的进行配置。
proxool是一个非常强大的连接池工具包,我觉得相比dbcp、c3p0这两个连接池包都要好用,我用loadrunner测试过,这三个连接池的从性能上排名如下:proxool>c3p0>dbcp,特别是dbcp在大并发的情况下总是出现各种异常。

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

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

proxool.xml 代码

Xml代码
  1. <!--sp-->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>    
<!--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代码
  1. <!--sp-->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>    
<!--sp-->xml version="1.0" encoding="UTF-8"?>     <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee           http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">         <servlet>             <servlet-name>ServletConfigurator</servlet-name>             <servlet-class>                 org.logicalcobwebs.proxool.configuration.ServletConfigurator               </servlet-class>             <init-param>                 <param-name>xml</Fileparam-name>                 <param-value>WEB-INF/proxool.xml</param-value>             </init-param>             <load-on-startup>1</load-on-startup>         </servlet>         <servlet>             <servlet-name>Admin</servlet-name>             <servlet-class>                 org.logicalcobwebs.proxool.admin.servlet.AdminServlet               </servlet-class>         </servlet>         <servlet-mapping>             <servlet-name>Adminservlet-name>             <url-pattern>/adminurl-pattern>         </servlet-mapping>         <servlet>             <servlet-name>TestServlet</servlet-name>             <servlet-class>                 selfservice.TestServlet               </servlet-class>         </servlet>         <servlet-mapping>             <servlet-name>TestServlet</servlet-name>             <url-pattern>/TestServlet</url-pattern>         </servlet-mapping>     </web-app>     



以上配置完成后,第三步就可以创建一个连接池的类了

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



Spring中proxool连接池的方式

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

applicationContext.xml代码

Xml代码
  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> 
<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用户指南。

你可能感兴趣的:(proxool连接池的实现2)