首页 > Java教程 > 正文

快过年了,大家都在网上订票了,铁道部的订票网的访问速度,实在是太让人感动了。本人受到刺激后,对自己的框架做了一次性能优化,首先从数据库连接池开始。现在常用的开源数据连接池主要有c3p0,dbcp和proxool三种,其中: hibernate开发组推荐使用c3p0;spring开发组推荐使用dbcp (dbcp连接池有weblogic连接池同样的问题,就是强行关闭连接或数据库重启后,无法reconnect ,告诉连接被重置,这个设置可以解决); hibernate in action推荐使用c3p0和proxool。下面具体就每种连接池的调研结果进行说明:

1. Apache-DBCP

在使用DBCP的时候,如果使用默认值,则数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际上就会是无效的数据库连接。BasicDataSource 基本配置如下:

<!-- 数据源配置,使用应用内的DBCP数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <!-- Connection Info -->
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="url" value="${jdbc.url}" />
    <!-- Connection Pooling Info -->
    <property name="initialSize" value="5" />
    <property name="maxActive" value="100" />
    <property name="maxIdle" value="30" />
    <property name="maxWait" value="500" />
    <property name="defaultAutoCommit" value="false" />
</bean>

2. C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,同时,也是hibernate推荐的。该连接池解决了dbcp无法自动重连问题,在稳定性方面也比较稳定。基本配置信息如下:

<!-- C3P0数据库连接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <!-- 最大连接数 -->
    <property name="maxPoolSize" value="20" />
    <!-- 最小连接数 -->
    <property name="minPoolSize" value="5" />
    <!-- 验证等待请求是否超时-->
    <property name="checkoutTimeout" value="120" />
    </bean>

3. Proxool

Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。目前是和DBCP以及C3P0一起,最为常见的三种JDBC连接池技术。日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0。关于这个连接池,我在测试时,发现默认情况下,也是不会自动重连的。常用配置如下:

<?xml version="1.0" encoding="UTF-8"?>  
 
<something-else-entirely>  
    <proxool>  
        <alias>dbname</alias> <!--数据源的别名-->  
        <driver-url>jdbc:oracle:thin:@127.0.0.1:1521:testdb</driver-url><!--url连接串-->  
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <!--驱动类-->  
        <driver-properties>  
            <property name="user" value="username" /> <!--用户名-->  
            <property name="password" value="password" /><!--密码-->  
        </driver-properties>   
        <!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定 -->  
        <maximum-connection-count>100</maximum-connection-count>   
        <!--最小连接数(默认2个)-->  
        <minimum-connection-count>10</minimum-connection-count>   
        <!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒-->  
        <house-keeping-sleep-time>90000</house-keeping-sleep-time>  
        <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->  
        <maximum-new-connections>10</maximum-new-connections>   
        <!--最少保持的空闲连接数(默认2个)-->  
        <prototype-count>5</prototype-count>   
        <!--在使用之前测试-->  
        <test-before-use>true</test-before-use>  
        <!--用于保持连接的测试语句 -->  
        <house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql>  
    </proxool>  
</something-else-entirely> 

从配置项的内容来看,C3P0和DBCP都有比较详细的有关连接检测保证的配置,我们可以看到C3P0可以控制数据源内加载的PreparedStatements数量,并且可以设置帮助线程的数量来提升JDBC操作的速度,这些是DBCP未提供的;另外从网络上的评价来看,DBCP出现Bug的频率要大于C3P0,不过这一点有待于我们自己实际的检测。 Proxool与DBCP以及C3P0的性能比较,网上众说纷纭,有待我们自己的测试。

根据以上三种连接池的情况来看,在首次访问时,dbcp大约需要600毫秒,c3p0需要450毫秒,proxool需要1356毫秒,访问后,速度基本都在几十毫秒以内,除非sql写得很复杂。以上的测试毫秒数,只是本人根据日志来反映的,不据参考价值,虽然网上说proxool性能最好,我觉得,还是自己使用后才知道真正的性能。

以上内容来自于网络,如有侵权联系即删除。

猜你喜欢
发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论信息