首先让我们了解mysql属性.
> interactive_timeout:mysql shell会话的交互式超时
在几秒钟内像mysqldump或mysql命令行工具.连接处于睡眠状态.大多数情况下,这是设置为更高的值,因为你不希望它在mysql cli上做某事时断开连接.
> wait_timeout
:MySQL将在之前等待的不活动期间的秒数
它将关闭非交互式连接上的连接
秒.示例:从java连接.连接处于睡眠状态.
现在让我们了解c3po属性及其与DB道具的关系.(我将从你的问题中复制)
maxIdleTime: (Default: 0) Seconds a Connection can remain pooled but unused before being discarded. Zero means idle connections never
expire.
这指的是连接对象可以使用多长时间并且可以在池中使用.一旦超时结束,c3po将销毁或回收它.
现在,当maxIdleTime高于wait_timeout时会出现问题.
假设如果mxIdleTime:50秒并且wait_timeout:40秒,则会出现连接超时异常:如果您尝试在最后10秒内执行任何操作,则会断开管道.所以maxIdelTime应该总是小于wait_timeout.
您可以使用以下属性代替maxIdleTime.
> idleConnectionTestPeriod设置连接长度的限制
在测试前保持闲置状态.没有preferredTestQuery,默认
是DatabaseMetaData.getTables() – 它与数据库无关,并且
虽然一个相对昂贵的电话,可能是一个很好的
数据库比较小.如果你对性能有偏见,请使用a
查询特定于您的数据库(即preferredTestQuery =“SELECT 1”)
> maxIdleTimeExcessConnections将恢复connectionCount
在活动激增之后下至minPoolSize.
请注意,任何池属性(例如maxIdleTime)仅影响池中的连接,即如果hibernate已获取连接并使其空闲时间超过maxIdleTime然后尝试执行任何操作,那么您将获得“Broken Pipe”
在mysql上使用较低的wait_timeout是件好事,但是当你已经构建了一个应用程序时,它并不总是正确的.
在减少它之前,你必须确保在你的应用程序中你没有保持连接打开等待更多的wait_time.
您还必须考虑获取连接是一项昂贵的任务,如果等待时间太短,那么它会超过连接池的全部目的,因为它会经常尝试获取连接.
当您没有手动进行连接管理时(例如使用Spring跨国API时),这一点尤为重要.当您输入@Transaction带注释的方法时,Spring会启动事务,以便从池中获取连接.如果您正在进行任何Web服务调用或读取某个文件,这将花费比wait_time更多的时间,那么您将获得异常.
我曾经遇到过这个问题.
在我的一个项目中,我有一个cron,可以为客户进行订单处理.为了加快速度,我使用了批处理.现在,一旦我检索了一批客户并进行了一些处理(没有数据库调用).当我尝试保存所有的命令时,我用来破坏管道异常.问题是我的wait_timeout是1分钟,订单处理花了更多的时间.所以我们不得不把它增加到2分钟.我可以减少批量大小,但这使得整体处理速度变慢.