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