我有一个Spring + Mysql (JDBC 4) + c3p0 0.9.2项目。
在c3p0中maxIdleTime值为240 (即4分钟)。和wait_timeout在Mysql的my.ini中转换到30秒。
根据c3p0
maxIdleTime:(缺省值:0秒)连接可以保持池,但在被丢弃之前未使用。零表示空闲连接永不过期。
根据Mysql
wait_timeout:服务器在非交互式连接上等待活动的秒数,然后关闭它。
现在我在这方面遇到了一些麻烦:(我知道了一些答案,只是为了确定我是否正确)。
sleep状态的连接。wait_timeout设置为30秒(他通过观察DB服务器来达到此值,从而使处于睡眠模式的连接数量非常少),这意味着连接可以处于sleep模式30秒之后,它将被关闭,但另一方面,C3P0的maxIdleTime设置为240秒,所以在本例中扮演的角色是什么maxIdleTime设置。interactive_timeout?发布于 2014-07-09 14:10:49
首先,让我们了解mysql的属性。
interactive_timeout:mysqldump会话的交互式超时(以秒为单位),如mysqldump或mysql命令行工具。连接处于睡眠状态。大多数情况下,这会被设置为更高的值,因为您不希望它在mysql上运行时断开连接。wait_timeout:MySQL在不活动期间等待的秒数,然后它将在秒内关闭非交互连接上的连接。示例:从java连接。连接处于睡眠状态。现在让我们来了解一下c3po属性及其与DB道具的关系。(我将复制您的问题)
maxIdleTime:(缺省值:0秒)连接可以保持池,但在被丢弃之前未使用。零表示空闲连接永不过期。这是指连接对象可以使用多长时间,并且在池中可用。一旦超时结束,c3po将销毁或回收它。
现在,当maxIdleTime高于wait_timeout时,问题就出现了。比方说,如果mxIdleTime : 50 secs和wait_timeout : 40 s,那么如果您试图在最后10秒内执行任何操作,那么就会得到Connection time out exception: Broken Pipe。因此,maxIdelTime应该总是小于wait_timeout。
您可以使用以下属性代替maxIdleTime。
idleConnectionTestPeriod对连接在测试之前保持空闲的时间设置了一个限制。如果没有preferredTestQuery,默认情况是DatabaseMetaData.getTables() --这与数据库无关,虽然调用比较昂贵,但对于相对较小的数据库来说可能是可以的。如果您偏执于性能,请使用特定于数据库(i.e. preferredTestQuery="SELECT 1")的查询maxIdleTimeExcessConnections将在活动激增后将connectionCount带回到minPoolSize。请注意,任何游泳池财产(如。( maxIdleTime)只影响池中的连接,也就是说,如果hibernate已经获得了一个连接,并使它比maxIdleTime保持空闲状态,然后尝试执行任何操作,那么您将得到“断开管道”。
在mysql上使用较低的wait_timeout是很好的,但是当您已经构建了一个应用程序时,它并不总是正确的。在减少它之前,您必须确保在您的应用程序中,您不会为更多的wait_time打开连接。
您还必须考虑到,获取连接是一项昂贵的任务,如果等待时间太低,那么它就超出了拥有连接池的全部目的,因为它经常尝试获取连接。
当您不手动进行连接管理时,这一点尤其重要,例如,当您使用Spring跨国API时。当您输入一个带有@Transaction注释的方法时,Spring就会启动事务,这样它就可以从池中获得一个连接。如果您正在进行任何web服务调用或读取某个文件,这将花费比wait_time更长的时间,那么您将得到异常。
我曾经面对过这个问题。
在我的一个项目中,我有一个cron,它可以为客户进行订单处理。为了使它更快,我使用了批处理。现在,一旦我检索到一批客户并进行一些处理(没有db调用)。当我试图保存所有的订单时,我会遇到坏掉的管道异常。问题是我的wait_timeout是1分钟,订单处理需要更多的时间。所以我们不得不把它增加到2分钟。我本可以减少批处理的大小,但这使得整个处理速度变慢了。
发布于 2014-07-11 10:49:23
未使用的连接是指根据mysql(?)处于睡眠状态的连接。
mysql认为,这仅仅意味着使用mysql/db建立了一个连接,但是由于mysql的配置/设置(可以更改),在过去的时间里这里没有任何活动,因此连接被销毁。
什么是交互的和非交互的连接?交互式连接是当您的输入硬件(键盘)使用命令行与mysql交互时。简而言之,在哪里编写查询
非交互式或更确切地说是wait_timeout查询是代码为之建立与mysql连接的查询。
未使用的连接和非交互的连接是相同的吗?因为我的DBA将wait_timeout设置为30秒(他通过观察DB服务器来达到这个值,从而使处于睡眠模式的连接数量非常少),这意味着连接可以处于休眠模式30秒之后,它将被关闭,但另一方面,C3P0的maxIdleTime设置为240秒,所以在这种情况下,这个maxIdleTime设置起什么作用。
MaxIdleTime是由您的代码在hibernateJpa配置下完成的,在该配置中,您要求代码本身在连接未使用后关闭hibernate连接(例如)。作为一个编码器,你拥有这方面的所有权。
另一方面,Wait_timeout来自mysql方面。因此,应该由DB管理员来设置和更改它。
interactive_timeout是什么?
同样,交互式超时是在从命令行上的键盘连接到mysql之后编写查询的时候,而mysql中的conf也会出现。
如果您想了解更多关于如何更改这些值的信息,请浏览以下链接:timeout/
希望现在你已经清楚了。)
https://stackoverflow.com/questions/24565274
复制相似问题