快过年了,大家都在网上订票了,铁道部的订票网的访问速度,实在是太让人感动了。本人受到刺激后,对自己的框架做了一次性能优化,首先从数据库连接池开始。现在常用的开源数据连接池主要有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性能最好,我觉得,还是自己使用后才知道真正的性能。
以上内容来自于网络,如有侵权联系即删除。
猜你喜欢
发表评论
电子邮件地址不会被公开。 必填项已用*标注