不活动期间后的连接超时值

问题描述:

我们有一个使用hibernate作为ORM工具的api,我们使用c3p0作为连接池处理程序。当我们负荷很重时,我们没有任何问题。但是,如果api在一天左右停用,我们正在耗尽“无法获得连接”的例外。所以,如果周末没有人使用api,我们会在周一早上发现连接错误。不活动期间后的连接超时值

Caused by: java.sql.SQLException: An attempt by a client to checkout a Connection has timed out. 

我们使用mysql作为数据库。在我的研究中,我知道mySQL在8个小时左右之后会使连接失效。连接池可能会向客户端发出一个陈旧的连接,从而导致客户端的连接超时异常。

目前我们在C3Po中没有配置任何连接测试。比方说,如果我使用IdleTestPeriod在连接池被给予客户端之前测试连接。那么如果我所有的连接在某个时间点都通过了测试,会发生什么?将这些失败的连接从池中移除并重新生成新的活动连接吗?

目前,这是我们正在使用的c3p0设置。任何其他原因可能出现这个问题?

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${----}"/> 
     <property name="jdbcUrl" value="${----}"/> 
     <property name="user" value="${----}"/> 
     <property name="password" value="${------}"/> 
     <property name="minPoolSize" value="5"/> 
     <property name="acquireIncrement" value="5" /> 
     <property name="maxPoolSize" value="125" /> 
     <property name="maxStatements" value="10" /> 
     <property name="maxIdleTime" value="180" /> 
     <property name="maxIdleTimeExcessConnections" value="30" /> 
     <property name="checkoutTimeout" value="3000" /> 
     <property name="preferredTestQuery" value="SELECT 1" /> 
    </bean> 

感谢您的帮助

高可用性和集群MySQL Java Connector的部分,看看属性;具体为autoReconnectautoReconnetForPools。 使用您的JDBC连接URL中的属性。在使用MySQL,Hibernate和C3P0之前,他们帮助过我。希望这有助于。

因此,您有3秒(3000毫秒)的checkoutTimeout设置。这是你看到的例外。客户端只允许等待三秒钟才能检出池中的连接;如果三秒钟不够,他们会看到你的例外。

问题是,为什么客户需要这么长时间才能获得连接?通常检查一个连接是一个非常快的操作。但是,如果所有连接都被检出,则客户端必须等待从数据库中(缓慢)获取连接。

您的池已配置为非常积极地剔除连接。如果minPoolSize = 5以上的连接数超过maxIdleTimeExcessConnections = 30秒,则它们将被销毁。然而,您的池配置为大规模爆发:maxPoolSize = 125。假设你的应用安静了一段时间,然后从客户端得到一连串的连接请求。池将很快耗尽连接并开始以acquireIncrement = 5的突发获取。但是,如果突然有25个客户端,并且该池只有5个连接,那么在获取Connection之前,第25个客户端可能会超时并不是不太可能。

有很多你可以做的。这些调整是可以分开的,你可以根据需要混合或匹配。 1)将闲置的“多余”连接扼杀在较不积极的位置,这样一般情况下,你的池有一定的能力来处理突发的请求。您可以完全删除maxIdleTimeExcessConnections,并且让连接慢慢地在maxIdleTime = 180秒废弃之后到达。 (下行?在不活动期间较长的资源占用空间较长)

2)将minPoolSize设置为较高的值,以便池不太可能看到一连串的活动,而且它的活动太少Connections(Downside ?更大的永久资源足迹。)

3)从您的配置中删除checkoutTimeout。 c3p0的默认设置是允许客户端无限期地等待Connection。 (下行?也许你更喜欢客户快速报告失败,而不是等待可能的成功。)

我不认为你观察到的问题与连接测试或MySQL超时本身有很大关系,但这并不意味着你不应该处理这些问题。我会推迟nobeh对MySQL重新连接问题的建议。 (我不是一个大的MySQL用户。)你应该考虑实现连接测试。你有一个preferredTestQuery,所以测试应该相当快。我通常的选择是使用testConnectionOnCheckin和idleConnectionTestPeriod。见http://www.mchange.com/projects/c3p0/#configuring_connection_testing

祝你好运!