Proxool连接池实现

关键字: proxoll 连接池

首先从 http://proxool.sourceforge.net/ 下载
proxool-0.9.0RC2.zip
解压后,把proxool-0.9.0RC2.jar放到工程的lib文件夹里面。
proxool是一个非常强大的连接池工具包,我觉得相比dbcp、c3p0这两个连接池包都要好用,我用loadrunner测试过,这三个连接池的从性能上排名如下:proxool>c3p0>dbcp,特别是dbcp在大并发的情况下总是出现各种异常。详细关于dbcp的介绍请参考dbcp用户指南,dbcp实现参考tvjody.iteye.com/admin/show/117225。

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

JDBC连接方法:

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


proxool.xml 代码
xml 代码
xml version="1.0" encoding="UTF-8"?>    
  
    
  
<something-else-entirely>  
    <proxool>  
          
        <alias>DBPoolalias>  
          
        <driver-url>jdbc:oracle:thin:@192.168.0.40:1521:drcomdriver-url>  
          
        <driver-class>oracle.jdbc.driver.OracleDriverdriver-class>  
        <driver-properties>  
            <property name="user" value="drcom"/>  
            <property name="password" value="drcom"/>  
        driver-properties>  
          
        <house-keeping-sleep-time>90000house-keeping-sleep-time>  
            
        <maximum-new-connections>150maximum-new-connections>  
            
        <prototype-count>3prototype-count>  
            
        <maximum-connection-count>100maximum-connection-count>  
          
        <minimum-connection-count>3minimum-connection-count>  
    proxool>  
something-else-entirely>  



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


web.xml 代码

xml 代码
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>ServletConfiguratorservlet-name>  
        <servlet-class>  
            org.logicalcobwebs.proxool.configuration.ServletConfigurator   
        servlet-class>  
        <init-param>  
            <param-name>xmlFileparam-name>  
            <param-value>WEB-INF/proxool.xmlparam-value>  
        init-param>  
        <load-on-startup>1load-on-startup>  
    servlet>  
    <servlet>  
        <servlet-name>Adminservlet-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>TestServletservlet-name>  
        <servlet-class>  
            selfservice.TestServlet   
        servlet-class>  
    servlet>  
    <servlet-mapping>  
        <servlet-name>TestServletservlet-name>  
        <url-pattern>/TestServleturl-pattern>  
    servlet-mapping>  
web-app>  


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


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 代码
<property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProviderproperty>  
            <property name="hibernate.proxool.pool_alias">DBPoolproperty>  
            <property name="hibernate.proxool.xml">proxoolconf.xmlproperty>  


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

转自:http://tvjody.iteye.com/blog/117604

你可能感兴趣的:(spring,Hibernate,xml,servlet,loadrunner)