首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c3p0 maxIdleTime和mysql的wait_timeout是一样的?

c3p0 maxIdleTime和mysql的wait_timeout是一样的?
EN

Stack Overflow用户
提问于 2014-07-04 00:54:44
回答 2查看 15.9K关注 0票数 9

我有一个Spring + Mysql (JDBC 4) + c3p0 0.9.2项目。

在c3p0中maxIdleTime值为240 (即4分钟)。和wait_timeout在Mysql的my.ini中转换到30秒。

根据c3p0

maxIdleTime:(缺省值:0秒)连接可以保持池,但在被丢弃之前未使用。零表示空闲连接永不过期。

根据Mysql

wait_timeout:服务器在非交互式连接上等待活动的秒数,然后关闭它。

现在我在这方面遇到了一些麻烦:(我知道了一些答案,只是为了确定我是否正确)。

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

回答 2

Stack Overflow用户

回答已采纳

发布于 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分钟。我本可以减少批处理的大小,但这使得整个处理速度变慢了。

票数 30
EN

Stack Overflow用户

发布于 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/

希望现在你已经清楚了。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24565274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档