c3p0,dbcp,proxool的三种数据源的使用

dbcp:
在applicationContext.xml中配置,
<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName">
		<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		    <property name="url">
	    <value>jdbc:oracle:thin:@192.168.1.110:1521:orcl</value> 
		    </property>
		    <property name="username">
		      <value>用户名</value>
		    </property>
		    <property name="password">
		      <value>密码</value>
		    </property>

		<property name="maxActive">
			<value>50</value>
		</property>
		<property name="maxIdle">
			<value>2</value>
		</property>
		<property name="maxWait">
			<value>120000</value>
		</property>
		<property name="defaultAutoCommit">
			<value>false</value>
		</property>

		<property name="testOnBorrow">
			<value>true</value>
		</property>

		<property name="testOnReturn">
			<value>false</value>
		</property>

		<property name="validationQuery">
			<value>select 1 from dual</value>
		</property>
	</bean>

driverClassName
url
username
password
上面四个分别是驱动,连接字符串,用户名和密码

maxActive 连接池支持的最大连接数
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

minEvictableIdleTimeMillis 连接池中连接可空闲的时间,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒没有使用的活动连接,清理后并没有放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true,false,连接池收回空闲的活动连接时是否打印消息


minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样,minEvictableIdleTimeMillis针对连接池中的连接对象,removeAbandonedTimeout针对未被close的活动连接.

在dbcp使用中遇到的问题:
当短时间之内活动连接达到maxActive,再请求连接,等maxWait秒后连接池就会报出错来:Cannot get a connection, pool exhausted.在这maxWait秒里removeAbandoned并没有起作用,出错后连接池就会把所有的连接断开,为什么这时候removeAbandoned没有起作用呢?
弊端: 日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0。


c3p0:
在tomcat/config/service.xml
	<Resource name="jdbc/hb" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" />
    <ResourceParams name="jdbc/hb"> 
    <parameter>
    <name>factory</name>
    <value>org.apache.naming.factory.BeanFactory</value>
    </parameter>
    <parameter>
    <name>driverClass</name>
    <value>oracle.jdbc.driver.OracleDriver</value>
    </parameter> 
    <parameter>
    <name>jdbcUrl</name>
    <value>jdbc:oracle:thin:@127.0.0.1:1521:orcl</value>
    </parameter> 
    <parameter>
    <name>user</name>
    <value>hb</value>
    </parameter>
    <parameter>
    <name>password</name>
    <value>hb</value>
    </parameter> 
    <parameter>
    <name>minPoolSize</name>
    <value>30</value>
    </parameter> 
    <parameter>
    <name>maxPoolSize</name>
    <value>200</value>
    </parameter>
    <parameter>
    <name>initialPoolSize</name>
    <value>30</value>
    </parameter>
    <parameter>
    <name>acquireIncrement</name>
    <value>30</value>
    </parameter>
    <parameter>
    <name>idleConnectionTestPeriod</name>
    <value>60</value>
    </parameter>
    <parameter>
    <name>maxIdleTime</name>
    <value>60</value>
    </parameter>
    </ResourceParams>

driverClass
jdbcUrl
user
password
minPoolSize
maxPoolSize
initialPoolSize

acquireIncrement 池中没有空闲连接时,一次请求获取的连接数
maxIdleTime 池中连接最大空闲时间
acquireRetryAttempts 获取连接失败后,重新尝试的次数
acquireRetryDelay 尝试连接间隔时间,毫秒
checkoutTimeout 等待连接时间,0为无限等待,毫秒
DebugUnreturnedConnectionStackTraces true,false,是否收回未返回的活动连接
unreturnedConnectionTimeout 活动连接的时间.
DBCP,C3P0,Proxool,BoneCP参数介绍
c3p0的最大空闲时间为什么不起作用。(新dbcp问题)
DBCP连接池配置参数说明及优化

driverClassName
url
username
password
上面四个分别是驱动,连接字符串,用户名和密码

maxActive 连接池支持的最大连接数
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每

timeBetweenEvictionRunsMillis毫秒秒检查一次连接池中空闲的连接,把空闲时间超过minEvictableIdleTimeMillis毫秒的连接断开,直到连接池中的连接数到minIdle为止

minEvictableIdleTimeMillis 连接池中连接可空闲的时间,毫秒

removeAbandoned true,false,是否清理removeAbandonedTimeout秒没有使用的活动连接,清理后并没有放回连接池
removeAbandonedTimeout 活动连接的最大空闲时间
logAbandoned true,false,连接池收回空闲的活动连接时是否打印消息


minEvictableIdleTimeMillis,removeAbandonedTimeout这两个参数针对的连接对象不一样,minEvictableIdleTimeMillis针对连接池中的连接对象,removeAbandonedTimeout针对未被close的活动连接.

在dbcp使用中遇到的问题:
当短时间之内活动连接达到maxActive,再请求连接,等maxWait秒后连接池就会报出错来:Cannot get a connection, pool exhausted.在这maxWait秒里removeAbandoned并没有起作用,出错后连接池就会把所有的连接断开,为什么这时候removeAbandoned没有起作用呢?


c3p0:
driverClass
jdbcUrl
user
password
minPoolSize
maxPoolSize
initialPoolSize

acquireIncrement 池中没有空闲连接时,一次请求获取的连接数
maxIdleTime 池中连接最大空闲时间
acquireRetryAttempts 获取连接失败后,重新尝试的次数
acquireRetryDelay 尝试连接间隔时间,毫秒
checkoutTimeout 等待连接时间,0为无限等待,毫秒
DebugUnreturnedConnectionStackTraces true,false,是否收回未返回的活动连接
unreturnedConnectionTimeout 活动连接的时间.

c3p0中的问题:
unreturnedConnectionTimeout是给每个活动连接一个时间限制,到点儿就收回,不管有没有正在使用连接.这样不是太好,应该是从最后一次使用连接才开始计时才好.那有没有这样的一个参数从最后一次使用计时呢? .

c3p0与dbcp区别:
   dbcp没有自动的去回收空闲连接的功能   c3p0有自动回收空闲连接功能

proxool
在src下面proxool.xml文件中
<?xml version="1.0" encoding="UTF-8"?>  
<something-else-entirely>  
    <proxool>  
        <alias>DBPool</alias>  
        <driver-url>
            jdbc:oracle:thin:@192.168.1.110:1521:sttri
        </driver-url>  
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>  
        <driver-properties>
            <property name="user" value="用户名" />  
            <property name="password" value="密码" />  
        </driver-properties>
        <!-- 连接最大活动时间(毫秒)--> 
        <maximum-active-time>120000</maximum-active-time>  
        <!-- 连接最大生命时间 (毫秒)-->
        <maximum-connection-lifetime>36000000</maximum-connection-lifetime>  
        <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 --> 
        <house-keeping-sleep-time>60000</house-keeping-sleep-time>
        <!-- 并发数 -->
        <simultaneous-build-throttle>200</simultaneous-build-throttle>  
        
		<!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--> 
		<maximum-new-connections>20</maximum-new-connections>
		        
        <!-- 每次新增连接数 -->  
        <prototype-count>2</prototype-count>  
        <!--允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 -->  
        <maximum-connection-count>300</maximum-connection-count>  
        <!-- 最少保持的空闲连接数 -->  
        <minimum-connection-count>5</minimum-connection-count>
        
        <house-keeping-test-sql>select sysdate from dual </house-keeping-test-sql> 
        <!-- 
        <statistics>15s,10m,1d</statistics>
        <statistics-log-level>INFO</statistics-log-level>
         -->
    </proxool>  
</something-else-entirely>  

在src下的hibernage.cfg.xml
<session-factory>
	
	 	<property name="hibernate.proxool.pool_alias">  
            DBPool  
    </property>  
    <property name="hibernate.proxool.xml">proxool.xml</property>  
    <property name="hibernate.connection.provider_class">  
            org.hibernate.connection.ProxoolConnectionProvider  
    </property>
    
    <property name="hibernate.proxool.existing_pool">false</property>  
    <property name="dialect">
            org.hibernate.dialect.OracleDialect
    </property>  
    <!-- 设置数据库名 当url没有指定数据库时设置 -->
<!--    <property name="default_catalog">orcl</property>-->
    <property name="hibernate.show_sql">true</property>  
    <property name="hibernate.format_sql">true</property>

    <!-- 启用查询缓存 -->  
    <property name="hibernate.cache.use_query_cache">false</property>  
  
		<mapping resource="com/bean/hbm/TestBean.hbm.xml" />
		
	</session-factory>

因为hibernate宣布不再支持DBCP,所以SSH中,连接池最好使用proxool。


参考 http://www.iteye.com/topic/134698
http://baike.baidu.com/view/2098784.htm

猜你喜欢

转载自yjingzeming.iteye.com/blog/1671176