Amo*_*ogh 8 java mysql database-connection jdbc c3p0
我有一个Spring MVC + Mysql(JDBC 4)+ c3p0 0.9.2项目.
在c3p0中,maxIdleTime值为240(即4分钟),wait_timeout在Mysql的my.ini中为30秒.
根据c3p0
maxIdleTime :(默认值:0)秒可以在丢弃之前保持池的连接但未使用.零意味着空闲连接永不过期.
根据Mysql
wait_timeout:服务器在关闭非交互式连接之前等待活动的秒数.
现在我对此有一些了解:(我知道一些答案,只是为了确定我是否正确)
sleep根据mysql(?)处于状态的连接wait_timeout为30秒(他通过观察数据库服务器达到此值,因此连接数量非常少,处于睡眠模式)这意味着连接可以处于sleep模式30秒后,它将被关闭但是另一方面c3p0 maxIdleTime设置为240秒,因此maxIdleTime在这种情况下,此设置是否起作用.interactive_timeout?bit*_*kot 26
首先让我们了解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然后有一个chanse,你会得到Connection time out exception: Broken Pipe,如果你尝试做在最后10秒的任何操作.所以maxIdelTime应该总是那么少wait_timeout.
您可以使用以下属性代替maxIdleTime.
idleConnectionTestPeriod设置连接在测试之前保持空闲的时间限制.没有preferredTestQuery,默认是DatabaseMetaData.getTables()- 这是数据库不可知的,虽然相对昂贵的调用,对于相对较小的数据库可能是好的.如果您对性能感到偏执,请使用特定于您的数据库的查询(i.e. preferredTestQuery="SELECT 1")maxIdleTimeExcessConnections 在活动激增后,会将connectionCount恢复为minPoolSize.请注意,任何池属性(例如maxIdleTime)仅影响池中的连接,即如果hibernate已获取连接并使其保持空闲状态而不是maxIdleTime然后尝试执行任何操作,那么您将获得"Broken Pipe"
wait_timeout在mysql上降低是好的,但是当你已经构建了一个应用程序时,它并不总是正确的.在减少它之前你必须确保在你的应用程序中你没有保持连接打开更多wait_time.
您还必须考虑获取连接是一项昂贵的任务,如果等待时间太短,那么它会超过连接池的全部目的,因为它会经常尝试获取连接.
当您没有手动进行连接管理时(例如使用Spring跨国API时),这一点尤为重要.当您输入带@Transaction注释的方法时,Spring会启动事务,以便从池中获取连接.如果您正在进行任何Web服务调用或读取某个文件,这将花费比wait_time更多的时间,那么您将获得异常.
我曾经遇到过这个问题.
在我的一个项目中,我有一个cron,可以为客户进行订单处理.为了加快速度,我使用了批量处理.现在,一旦我检索了一批客户并进行了一些处理(没有数据库调用).当我尝试保存所有订单时,我曾经得到破坏管道异常.问题是我的wait_timeout是1分钟,订单处理花了更多的时间.所以我们不得不把它增加到2分钟.我可以减少批量大小,但这使得整体处理速度变慢.
| 归档时间: |
|
| 查看次数: |
11794 次 |
| 最近记录: |