问题
我正在开发一个使用 Apache Tomcat 中的连接池与 MySQL 通信的应用程序。我想知道为什么您要使用比默认值 28,800 秒更小的wait_timeout ?我看到减少等待超时有很多缺点,但有什么好处呢?
背景
参数wait_timeout定义为
服务器在关闭非交互式连接之前等待其活动的秒数。
问题
如果我将 wait_timeout 设置得太小,那么 MySQL 会终止在我的 Web 应用程序正在使用的连接池中仍然有效的连接。在我的情况下,我是唯一一个在任何时候都在使用该应用程序的人,所以当我不测试它时,数据库连接自然会空闲。我可以通过简单地将 MySQL 上的 wait_timeout 扩展到非常大的值来解决这个问题,这样即使我离开办公桌 2 周,池也不会返回死连接。
问题
- 为什么有人想要更短的等待时间?
- 存储连接的开销有那么糟糕吗?
- 尽管我了解连接池可以减轻创建连接的开销,但将空闲连接保留在内存中是否是个问题?
你应该可以延长 wait_timeout
注意MySQL 5.0、5.1、5.5、5.6的wait_timeout的最大值_
这些最大值将不存在,mysqld 无法处理它们。
连接池仅在替代方案方面节省开销:为新的数据库连接销毁和重新分配内存。这可能会导致数据库服务器上的操作系统进行更多的交换以处理内存。
我在一年前写过这个:打开和关闭数据库连接的成本是多少?
降低 wait_timeout 肯定会使 Apache 陷入混乱,因为 DB 连接的 PHP 和 Apache 对象仍在实例化,而 DB 连接决定提前终止且没有警告。在这种情况下,您可能必须扫描您
netstat
的任何TIME_WAIT
通过端口 3306 或 MySQL 正在使用的端口的任何连接。May 20, 2011
:为什么 MySQL 在我们的动态 PHP 站点上缓存数据?Aug 17, 2011
:连接太多Oct 26, 2011
:什么可能导致 PHP 和 MySQL 之间出现奇怪的查询超时?Feb 27, 2012
: MySQL 连接数远大于查询数如果存在这样的情况并阻止 Apache 打开新连接,则您必须自己杀死 TIME_WAIT。请参阅我的
Feb 01, 2012
ServerFault 帖子MySQL 降低 wait_timeout 值以减少打开的连接数,了解如何执行此操作。假设您有一个没有连接池的 Web 应用程序。
现在还假设您的 Web 应用程序泄漏了连接(没有正确关闭它们 - 例如:在 java 中不使用 finally 块)。长时间等待超时(默认值为 8 小时)时,泄漏连接的问题要大得多。该应用程序将很快耗尽连接(mysql 的“连接太多”错误)。
在典型的 Web 应用程序中,连接的打开和关闭都在单个 http 请求的范围内。因此,在几秒钟内不需要连接。通过降低等待超时,您应该能够消除“连接过多”的问题,而无需修复代码。
话虽如此,正确的解决方案仍然是修复代码以消除任何泄漏的连接。
根本不测试是最快的方法,不一定是最可扩展的,也几乎不是最好的。请注意,您所引用的文档建议偶尔测试空闲连接,即使对于优先考虑速度而不是连接可靠性的应用程序:“设置相当长的时间
idleConnectionTestPeriod
,并且根本不测试结帐和签入是一种出色的高性能方法。”相当长的时间可能只有 300 秒左右,除非您的池非常大。(连接测试大约需要一毫秒,因此每 5 分钟 50 次的开销非常低,特别是如果您设置了效率
preferredTestQuery
,您应该这样做(SELECT 1
在 MySql 上尝试。)c3p0 为您提供了很多处理连接超时的工具——任何连接测试方案都会清除超时连接,或者您可以简单地使用配置参数
maxIdleTime
,或者maxConnectionAge
如果您不想测试。