【问题标题】:c3p0 maxIdleTime is same as wait_timeout of mysql?c3p0 maxIdleTime 和 mysql 的 wait_timeout 一样吗?
【发布时间】:2014-08-25 06:15:05
【问题描述】:

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

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

根据 c3p0

最大空闲时间: (默认值:0) 在被丢弃之前,连接可以保持池化但未使用的秒数。零表示空闲连接永不过期。

根据Mysql

wait_timeout:服务器等待活动的秒数 关闭之前的非交互式连接。

现在我对此有一些疑问:(我知道一些答案,只是想确定我是否正确)

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

【问题讨论】:

  • 处于睡眠模式的连接很可能是池中的非活动连接。它们不应该关闭得太快,因为让您的池在下一次请求时重新创建它们的成本很高。为什么您的 DBA 建议将 wait_timeout 设置为 30 秒?
  • @flup,因为在负载测试时我观察到show full processlist 向我显示number of connections in DB=maxPoolSize 并且我不断收到Connections could not be acquired from the underlying database! 异常。我发布了这个问题,请阅读更多内容和一个stackoverflow.com/questions/24451317/…

标签: java mysql jdbc database-connection c3p0


【解决方案1】:

未使用的连接是指根据mysql(?)处于睡眠状态的连接

根据mysql,这仅仅意味着与mysql/db建立了连接,但是在过去的一段时间内这里没有任何活动,并且由于mysql的配置/设置(可以更改),连接被摧毁了。

什么是交互式和非交互式连接? 交互式连接是当您的输入硬件(键盘)使用命令行与 mysql 交互时。简而言之,您在哪里编写查询

非交互式或者更确切地说 wait_timeout 查询是您的代码与 mysql 建立连接的查询。

未使用的连接和非交互式连接是否相同?因为我的 DBA 将 wait_timeout 设置为 30 秒(他通过观察 DB 服务器来达到这个值,因此处于睡眠模式的连接数量非常少)这意味着连接可以在 30 秒后处于睡眠模式,然后它将被关闭但在另一方面 c3p0 的 maxIdleTime 设置为 240 秒,那么这个 maxIdleTime 设置在这种情况下扮演什么角色。

MaxIdleTime 由 hibernateJpa 配置中的代码完成,您可以在其中要求代码本身在未使用连接后关闭休眠连接(例如)。作为编码人员,您对此拥有所有权。

另一方面,Wait_timeout 来自 mysql 方面。因此,数据库管理员可以对其进行设置和更改。

什么是interactive_timeout?

再次,交互式超时是当您在命令行上从键盘连接到 mysql 后编写查询并且 mysql 中的 conf 启动时。

如果您想了解有关如何更改这些值的更多信息,请访问此链接: http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/

希望你现在清楚了。:)

【讨论】:

    【解决方案2】:

    首先让我们了解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() - 与数据库无关,并且 虽然是一个相对昂贵的电话,但可能对一个人来说很好 相对较小的数据库。如果您对性能有偏执,请使用 特定于您的数据库的查询(i.e. preferredTestQuery="SELECT 1")
    • maxIdleTimeExcessConnections 将带回连接计数 在活动激增后降至 minPoolSize。

    请注意,任何池属性(例如maxIdleTime)仅影响池中的连接,即如果休眠已获取连接并使其空闲时间超过 maxIdleTime 然后尝试做任何操作都会得到“Broken Pipe”

    在 mysql 上使用较低的wait_timeout 很好,但是当您已经构建了应用程序时,这并不总是正确的。 在减少它之前,您必须确保在您的应用程序中您没有保持连接打开超过wait_time

    您还必须考虑到获取连接是一项昂贵的任务,如果等待时间太短,那么它就无法达到拥有连接池的全部目的,因为它会经常尝试获取连接。

    当您不手动进行连接管理时,例如使用 Spring 跨国 API 时,这一点尤其重要。当您输入 @Transaction 带注释的方法时,Spring 开始事务,因此它从池中获取连接。如果您正在进行任何 Web 服务调用或读取某些文件,这将花费比 wait_timeout 更多的时间,那么您将获得异常。

    我曾经遇到过这个问题。

    在我的一个项目中,我有一个 cron 可以为客户处理订单。为了让它更快,我使用了批处理。现在,一旦我检索了一批客户并进行了一些处理(没有数据库调用)。当我尝试保存所有用于获取损坏管道异常的订单时。问题是我的 wait_timeout 是 1 分钟,而订单处理需要更多时间。所以我们不得不将它增加到 2 分钟。我本可以减少批量大小,但这会使整体处理速度变慢。

    【讨论】:

    • 感谢您的详细解释,您清除了我与 interactive_timeout、wait_timeout 和 maxIdleTime 相关的积分,但我没有得到您的最后两个要点,但不用担心我最终会被理解。
    • 是否可以将wait_timeout 最多减少 30/15 秒,以便没有连接处于睡眠模式?
    • 我已经更新了我的答案。简而言之,如果您确定您的应用程序保持连接的时间不超过 30 秒,则可以减少 wait_timeout。
    • 好的,我现在知道了,我在几天前发布了这个问题stackoverflow.com/questions/24451317/…,请您检查一下。我会建议你阅读所有的 cmets。
    • 我检查了问题和cmets。我只有一个问题,为什么你的 maxIdleTime 为 10 秒?你在 mysql 上的 wait_timeout 是什么。
    猜你喜欢
    • 2016-09-20
    • 2014-05-06
    • 2017-05-06
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多