如需转载,请注明出自:  http://www.blogjava.net/fantasyginge/
    在项目中尝试使用了几种开源的数据库连接池实现。一种是dbcp,一种是c3p0,还有一种是proxool,这几种数据库连接池都可以很容易的在Spring配置起来。性能总体上上感觉dbcp为最优,因为稳定性和并发性都是我的项目需要的。
     项目中经过反复测试,如果web server和数据库server不是同一个机器的话,在断网时间比较短的时间内三种数据库连接池都能较好的重连,但是在断网时间超过8个钟头proxool就不能恢复工作了。但是dbcp却能很快的重新连接。实际生产环境中稳定性和总体性能是最重要的,都需要做相应的测试才能放心的让系统上生产线。


这里给出项目中数据库连接池配置:

dbcp的jndi:
1<bean id="dataSource"
2        class="org.springframework.jndi.JndiObjectFactoryBean">
3        <property name="jndiName">
4        <value>java:comp/env/jdbc/mysql</value>
5        </property>
6        </bean>

proxool(proxool-0.9.0RC1)的配置:
<bean id="MySqlDataSource"
  class
="org.logicalcobwebs.proxool.ProxoolDataSource"
  lazy-init
="false">
  
<property name="driver">
   
<value>com.mysql.jdbc.Driver</value>
  
</property>
  
<property name="driverUrl">
   
<value>jdbc:mysql://ip:3306/dbname?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true</value>
  
</property>
  
<property name="user">
   
<value>user</value>
  
</property>
  
<property name="password">
   
<value>password</value>
  
</property>
  
<property name="maximumConnectionCount">
   
<value>500</value>
  
</property>
  
<property name="houseKeepingSleepTime">
   
<value>15000</value>
  
</property>
  
<property name="houseKeepingTestSql">
   
<value>select CURRENT_DATE</value>
  
</property>
  
<property name="testBeforeUse">
   
<value>true</value>
  
</property>
  
<property name="alias">
   
<value>mysqlProxoolDataSource</value>
  
</property>
  
<!--
  <property name="maximumActiveTime">
   <value>10000</value>
  </property>
  
-->
  
<property name="simultaneousBuildThrottle">
   
<value>1000</value>
  
</property>
  
<property name="trace">
   
<value>false</value>
  
</property>
 
</bean>




建议使用DBCP,配置在tomcat中,然后在spring中使用jndi的形式获取。

c3p0(c3p0-0.9.0):
 1<bean id="dataSource"     class="com.mchange.v2.c3p0.ComboPooledDataSource"
 2        destroy-method="close">
 3        <property name="driverClass">
 4        <value>com.mysql.jdbc.Driver</value>
 5        </property>
 6        <property name="jdbcUrl">
 7        <value>jdbc:mysql://192.168.0.225:3306/sendinmdb?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true</value>
 8        </property>
 9        <property name="user">
10        <value>********</value>
11        </property>
12        <property name="password">
13        <value>********</value>
14        </property>
15        <property name="maxPoolSize">
16        <value>100</value>
17        </property>
18        <property name="maxIdleTime">
19        <value>50</value>
20        </property>
21        <property name="maxStatementsPerConnection">
22        <value>100</value>
23        </property>
24        <property name="numHelperThreads">
25        <value>1000</value>
26        </property>
27        <property name="idleConnectionTestPeriod">
28        <value>30</value>
29        </property>
30        </bean>




直接copy & paste到spring配置文件里就可以使用了。

 

 

配置一些额外的tomcat 的DBCP连接池参数,也可以更好的使用到类似proxool提供的功能,只是dbcp更加稳定而已。

tomcat/conf/context.xml中插入一个Resource元素:

<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
 maxActive
="1000" maxIdle="30" maxWait="10000"
 username
="user" password="password" driverClassName="com.mysql.jdbc.Driver"
 validationQuery 
= "select current_date()"
 testOnBorrow 
= "true" testOnReturn = "false"  testWhileIdle = "true"
 timeBetweenEvictionRunsMillis 
= "15000" numTestsPerEvictionRun = "10" minEvictableIdleTimeMillis = "600000"
 url
="jdbc:mysql://ip:3306/sendinmdb?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true"/>

 

解释一下以下这些参数的含义:
validationQuery = "select current_date()"
 testOnBorrow = "true"
 testOnReturn = "false" 
testWhileIdle = "true"

当从池中获取一个Connection后使用 select current_date() 来测试该数据库连接的可用性,如果SQL语句返回结果则认为是一个有效的连接,否则将继续测试知道可以拿到有效的连接。当返回Connection给池的时候不进行验证,但是Connection空闲的时候就要进行认证。


timeBetweenEvictionRunsMillis = "15000"
DBCP 清空线程睡眠的间隙,如值为负数则不运行该线程

numTestsPerEvictionRun = "10"
清空线程每次验证的连接对象个数


minEvictableIdleTimeMillis = "600000"

Connection对象可以在池中空闲的最小时间,单位为毫秒


详细配置请访问
http://jakarta.apache.org/commons/dbcp/configuration.html
posted on 2006-03-22 16:15 fantasyginge 阅读(6970) 评论(4)  编辑  收藏 所属分类: Database
Comments
  • # re: 几种开源数据库连接池的使用感受
    小琴
    Posted @ 2007-05-22 12:00
    c3p0的配置是正确的。proxool我按照你的配置方式,总是报错:org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: 调用中无效的参数。不知道你是不是也在spring里面配置的呢。能给回复吗。  回复  更多评论   
  • # re: 几种开源数据库连接池的使用感受
    fantasyginge
    Posted @ 2007-05-25 15:01
    @小琴

    已经更新这篇文章,去掉了数字,你可以直接copy过去试,这个是我在项目中都使用过的配置  回复  更多评论   
  • # re: 几种开源数据库连接池的使用感受
    Norvid
    Posted @ 2008-04-11 10:53
    注意到你配置中写到“autoReconnect=true”。你这个是MySQL专用的吧?Oracle啥的就重连不上了。

    我没找到什么好的办法,又不能重启JEE服务器,当然我也不可能盯着。只好重新刷beanfactory了,让所有的service bean,包括beanfactory重新初始化。

    你有什么好办法?  回复  更多评论   
  • # re: 几种开源数据库连接池的使用感受
    fantasyginge
    Posted @ 2008-04-16 08:09
    请查看 http://ginge.javaeye.com 有关dbcp的文章  回复  更多评论   

只有注册用户登录后才能发表评论。


网站导航: