c3p0 maxIdleTime和mysql的wait_timeout相同?

时间:2014-07-04 00:54:45

标签: java mysql jdbc database-connection c3p0

我正在使用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:服务器等待活动的秒数   关闭之前的非交互式连接。

现在我正在讨论这个问题:(我知道一些答案,只是为了确定我是否正确)

  1. 未使用的连接是指根据mysql(?)
  2. 处于sleep状态的连接
  3. 什么是互动和非交互式连接?
  4. 未使用的连接和非交互式连接是否相同?因为我的DBA将wait_timeout设置为30秒(他通过观察数据库服务器来达到此值,因此连接数量非常少,处于睡眠模式)这意味着连接可以处于sleep模式30秒之后它将被关闭,但另一方面c3p0的maxIdleTime被设置为240秒,所以在这种情况下这个maxIdleTime设置的角色是什么。
  5. 什么是interactive_timeout

2 个答案:

答案 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/

希望现在你很清楚。:)