zoukankan      html  css  js  c++  java
  • [转]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用户指南。
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562392.html
Copyright © 2011-2022 走看看