C3P0,Proxool,BoneCP,Druid等连接池的断开自动重联功能

发布于 2021-11-14 15:13:08 字数 1600 浏览 685 评论 10

数据库连接池的断开自动重联、失败恢复功能显得很重要,不知道目前主流的数据库连接池:C3P0,Proxool,BoneCP,Druid等支持如何?

我知道的:

Proxool:

<!--proxool 解决与数据库断开重连问题(houseKeepingTestSql为oracle的语法,其他数据库类似) --> 
<property name="houseKeepingTestSql"> 
<value>select 1 from dual</value> 
</property> 
<property name="testBeforeUse"> 
<value>true</value> 
</property> 
<property name="testAfterUse"> 
  <value>true</value> 
</property>

C3P0:

breakAfterAcquireFailure: false
        true表示pool向数据库请求连接失败后标记整个pool为block并close,就算后端数据库恢复正常也不进行重连,客户端对pool的请求都拒绝掉。false表示不会标记 pool为block,新的请求都会尝试去数据库请求connection。默认为false。因此,如果想让数据库和网络故障恢复之后,pool能继续请求正常资源必须把此项配置设为false 
testConnectionOnCheckout: false
         true表示在每次从pool内checkout连接的时候测试其有效性,这是个同步操作,因此应用端的每次数据库调用,都会先通过测试sql测试其有效性,如果连接无效,会关闭此连接并剔除出pool,并尝试从pool内取其他连接,默认为false,此特性要慎用,会造成至少多一倍的数据库调用。 
testConnectionOnCheckin: false
       true表示每次把连接checkin到pool里的时候测试其有效性,因为是个事后操作,所以是异步的,应用端不需要等待测试结果,但同样会造成至少多一倍的数据库调用。 
idleConnectionTestPeriod: 60
       C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测。 
acquireRetryAttempts: 10
       重试次数
acquireRetryDelay: 1000

       重试间隔时间

感觉 断开自动重联 功能比较耗性能,不知道有没有什么更好的办法可以实现?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

恋你朝朝暮暮 2021-11-21 11:45:45

 

温少: 你好,

上次出现的问题 我再给您描述一下。

顾挽 2021-11-21 11:45:45

这个问题是druid无法在中文环境下识别ORA-17410这个错误为fatal exception导致的。

最新的快照解决了这个问题,请帮忙测试:http://code.alibabatech.com/mvn/snapshots/com/alibaba/druid/0.2.18-SNAPSHOT/

具体问题细节看这里:

https://github.com/alibaba/druid/issues/329

后知后觉 2021-11-21 11:45:36

请测试一下最新的druid-0.2.17版本,看是否问题还存在

2021-11-21 11:43:51

好的 多谢 3q I will try

浮生未歇 2021-11-21 11:43:07

回复
多谢 早点休息 :)

叹沉浮 2021-11-21 11:21:44

@wenshao

validationQuery 发现不起作用了 

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${db.connection.url}"/>
        <property name="username" value="${db.connection.username}"/>
        <property name="password" value="${db.connection.password}"/>

        <property name="filters" value="stat"/>

        <property name="maxActive" value="50"/>
        <property name="initialSize" value="2"/>
        <property name="maxWait" value="60000"/>
        <property name="minIdle" value="5"/>

        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
        <property name="minEvictableIdleTimeMillis" value="300000"/>

        <property name="validationQuery" value="SELECT 'x' from dual"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>

        <property name="poolPreparedStatements" value="true"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="50"/>
    </bean>

配置了相关参数之后 发现 过一段时间之后 连接数据库的时候 报 如下

java.sql.SQLException: 无法从套接字读取更多的数据
        at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1200)
        at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1155)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:279)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
        at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61)
        at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:491)
        at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3754)
        at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:167)
        at com.alibaba.druid.filter.stat.StatFilter.connection_close(StatFilter.java:254)
        at com.alibaba.druid.filter.FilterChainImpl.connection_close(FilterChainImpl.java:163)
        at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.cl

的错误

旧城烟雨 2021-11-21 11:07:50

配置自动连接  老是没效果,<property name="testConnectionOnCheckin" value="true"></property>   <property name="idleConnectionTestPeriod"

value="60" />   

java.sql.SQLException: You can't operate on a closed Connection!!!
[Cause: java.lang.NullPointerException
at com.mchange.v2.c3p0.impl.NewProxyConnection.rollback(NewProxyConnection.java:855)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

旧城烟雨 2021-11-21 10:04:13

http://blog.csdn.net/bonnie_ting/article/details/6822677

很详细了。testOnBorrow,testOnReturn, testWhileIdle 这三种connection有效性校验机制,testWhileIdle是性价比最高的...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文