在Spring中配置连接池

来源:互联网 发布:尼康中国倒闭 知乎 编辑:程序博客网 时间:2024/06/05 10:48

在Spring中配置连接池

一、连接池概述 数据库连接池概述:  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。  数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。  数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:  1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;  2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。  3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。目前常用的连接池有:C3P0、DBCP、Proxool网上的评价是:C3P0比较耗费资源,效率方面可能要低一点。DBCP在实践中存在BUG,在某些种情会产生很多空连接不能释放,Hibernate3.0已经放弃了对其的支持。Proxool的负面评价较少,现在比较推荐它,而且它还提供即时监控连接池状态的功能,便于发现连接泄漏的情况。


Proxool配置如下:
1、在spring配置文件中,一般在applicationContext.xml中
     <bean id="proxoolDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
            <property name="driver" value="${jdbc.connection.driverClassName}"/>
            <property name="driverUrl" value="${jdbc.connection.url}"/>
            <property name="user" value="${jdbc.connection.username}"/>
            <property name="password" value="${jdbc.connection.password}"/>
            <!-- 测试的SQL执行语句 -->
           <property name="houseKeepingTestSql" value="${proxool.houseKeepingTestSql}"/>
            <!-- 最少保持的空闲连接数 (默认2个) -->
             <property name="prototypeCount" value="${proxool.prototypeCount}"/>
            <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒) -->
            <property name="houseKeepingSleepTime" value="${proxool.hourseKeepingSleepTime}"/>
            <!-- 最大活动时间(超过此时间线程将被kill,默认为5分钟) -->
             <property name="maximumActiveTime" value="${proxool.maximumActiveTime}"/>
            <!-- 连接最长时间(默认为4个小时) -->
            <property name="maximumConnectionLifetime" value="${proxool.maximumConnectionLifetime}"/>
            <!-- 最小连接数 (默认2个) -->
            <property name="minimumConnectionCount" value="${proxool.minimumConnectionCount}"/>
            <!-- 最大连接数 (默认5个) -->
            <property name="maximumConnectionCount" value="${proxool.maximumConnectionCount}"/>
            <!-- -15s,10m,1d->
            <property name="statistics" value="${proxool.statistics}"/>
            <!-- 别名 -->
             <property name="alias" value="${proxool.alias}"/>
            <!-- -->
            <property name="simultaneousBuildThrottle" value="${proxool.simultaneous-build-throttle}"/>
     </bean>
     然后注入到sessionFactory中
     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
           <property name="dataSource" ref="proxoolDataSource"/>
     </bean>

Porxool 配置文件
--==--==--==--==--==<proxool.xml>==--==--==--==--==--==--==
<?xml version="1.0" encoding="UTF-8"?>
<proxool>
      <alias>WMS</alias>
      <driver-url>jdbc:postgresql://192.168.210.184:5432/wms</driver-url>
      <driver-class>org.postgresql.Driver</driver-class>
      <driver-properties>
             <property name="user" value="wms_user" />
             <property name="password" value="wms" />
      </driver-properties>
      <minimum-connection-count>2</minimum-connection-count>
      <maximum-connection-count>40</maximum-connection-count>
      <simultaneous-build-throttle>20</simultaneous-build-throttle>
      <prototype-count>2</prototype-count>
      <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
--==--==--==--==--==<proxool.xml>==--==--==--==--==--==--==
 
配置说明:
alias                                          -〉数据库连接别名(程序中需要使用的名称)
driver-url                                   -〉数据库驱动
driver-class                                -〉驱动程序类
driver-properties                        -〉联机数据库的用户和密码
minimum-connection-count          -〉最小连接数量,建议设置0以上,保证第一次连接时间
maximum-connection-count         -〉最大连接数量,如果超过最大连接数量则会抛出异常。连接数设置过多,服务器CPU和内存性能消耗很大。
simultaneous-build-throttle          -〉同时最大连接数
prototype-count                          -〉一次产生连接的数量。
                                                 例:如果现在prototype-count设置为4个,但是现在已经有2个可以获得的连接,那么将会试图再创建2个连接。
                                                  但不能超过最大连接数。
maximum-active-time                 -〉连接最大时间活动 默认5分钟
maximum-connection-lifetime      -〉连接最大生命时间 默认4小时


  例子如下:

conf.properties

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.username=*********
jdbc.password=*********
jdbc.newweb.username=*********
jdbc.newweb.password=cmsmonitor

jdbc.url=jdbc:oracle:thin:@192.168.1.234:1521:ora10g
jdbc.driverUrl=jdbc:oracle:thin:用户名/密码@192.168.1.234:1521:ora10g
jdbc.newweb.driverUrl=jdbc:oracle:thin:*********/*********@192.168.1.234:1521:ora10g

applicationContext-specific.xml的spring配置文件

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
        "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:conf.properties</value>
            </list>
        </property>
    </bean>

    <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
        <property name="driver" value="${jdbc.driverClassName}"/>
        <property name="driverUrl" value="${jdbc.driverUrl}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <property name="houseKeepingSleepTime">
            <value>90000</value>
        </property>
        <property name="prototypeCount">
            <value>5</value>
        </property>
        <property name="maximumConnectionCount">
            <value>100</value>
        </property>
        <property name="minimumConnectionCount">
            <value>4</value>
        </property>
        <property name="trace">
            <value>true</value>
        </property>
        <property name="verbose">
            <value>true</value>
        </property>
    </bean>
    <bean id="dataSourceNewWeb" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName" value="${jdbc.driverClassName}"/>
     <property name="url" value="${jdbc.url}"/>
     <property name="username" value="${jdbc.newweb.username}"/>
     <property name="password" value="${jdbc.newweb.password}"/>
     <property name="initialSize" value="4" />
        <property name="maxActive" value="100" />
 </bean>
</beans>

上配置文件主要是配置两连接池(一个系统中用到一个数据库两用户,不同数据库配置也一样)。用到proxool和dbcp

proxool配置用在http://proxool.sourceforge.net/下载一个proxool.jar文件了,我用的是proxool-0.9.0RC3.jar

dbcp配置用到的jar:commons-dbcp-1.2.2.jar +commons-pool-1.5.4.jar 或commons-dbcp-1.2.2.jar   + commons-pool-1.3.jar 我用的proxool-0.9.0RC3.jar+commons-dbcp-1.3.jar,DriverManagerDataSource:在每个连接请求时都新建一个连接。与DBCP的BasicDataSource不同,DriverManagerDataSource提供的连接没有进行池管理。 SingleConnectionDataSource:在每个连接请求时都返回同一个连接。虽然它不同严格意义上的池管理数据源,但我们可以把它看做只有一个连接的池。
SingleConnectionDataSource只是用一个数据库连接,所以不适合用于多线程程序。而DriverManagerDataSource虽然能够支持多线程,但它会在每次连接请求时都建立一个连接,则是以性能为代价的。由于这些限制,我们强烈建议应该使用数据库连接池。

 

Bean定义档可以这么撰写:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans>    

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        

        <property name="driverClassName">            

<value>com.mysql.jdbc.Driver</value>   </property>        

<property name="url"> <value>jdbc:mysql://localhost:3306/TestDB</value> </property>      

   <property name="username"> <value>caterpillar</value> </property>      

   <property name="password"> <value>123456</value> </property>     </bean>                                                                                     <bean id="dataBean" class="onlyfun.caterpillar.DataBean">  <property name="dataSource">   <ref bean="dataSource"/>         </property>    

 </bean>

 </beans>如果您之前只使用spring-core.jar这个类别库,您还必须加入 spring-dao.jar, org.springframework.jdbc.datasource.DriverManagerDataSource是包括在这个类别库中,如果您使用的是spring.jar,当中已经包括了,无需加入任何的jar,当然,为了使用JDBC,您必须要有JDBC驱动程序的jar档。 可以用下面这段程序简单的测试一下:

 

C3P0配置如下:

    <!-- 定义数据源Bean,使用C3P0数据源实现 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <!-- 指定连接数据库的驱动 -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <!-- 指定连接数据库的URL -->
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mail"/>
        <!-- 指定连接数据库的用户名 -->
        <property name="user" value="root"/>
        <!-- 指定连接数据库的密码 -->
        <property name="password" value="root"/>
        <!-- 指定连接数据库连接池的最大连接数 -->
        <property name="maxPoolSize" value="20"/>
        <!-- 指定连接数据库连接池的最小连接数 -->
        <property name="minPoolSize" value="1"/>
        <!-- 指定连接数据库连接池的初始化连接数 -->
        <property name="initialPoolSize" value="1"/>
        <!-- 指定连接数据库连接池的连接的最大空闲时间 -->
        <property name="maxIdleTime" value="20"/>
    </bean>

如下: 

<bean id="dataSourceNewWeb" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass"><value>${jdbc.driverClassName}</value></property>
    <property name="jdbcUrl"><value>${jdbc.url}</value></property>
    <property name="user"><value>${jdbc.newweb.username}</value></property>
    <property name="password"><value>${jdbc.newweb.password}</value></property>
    <property name="minPoolSize" value="10" />
   <property name="maxPoolSize" value="100" />
   <property name="maxIdleTime" value="1800" />
   <property name="acquireIncrement" value="3" />
   <property name="maxStatements" value="1000" />
   <property name="initialPoolSize" value="10" />
   <property name="idleConnectionTestPeriod" value="60" />
   <property name="acquireRetryAttempts" value="30" />
   <property name="breakAfterAcquireFailure" value="true" />
   <property name="testConnectionOnCheckout" value="false" />

  </bean>

参考:http://hi.baidu.com/linyongboole/item/3470380bddd5b5354bc4a305

0 0
原创粉丝点击