连接池超时解决办法
连接池超时解决办法 mysql time_out
最近折腾了jpa后,接下来就会发现一个大的问题,就是mysql在连接8个小时后,会自动的释放连接。这个时候持久层用的连接池就会报错了,头疼的要死,后来找了一堆资料,看了下,只有一个办法,设置数据库连接的闲置时间,然后在连接池这一层做反闲置设置,意思就是在连接闲置以前先释放掉这个连接。就不会出现问题了。
我用的连接池是c3p0
第一步是修改数据库的闲置时间:
我这里用的是mysql
那么直接修改或者增加 MySQL 的 wait_timeout 属性的值。
修改/etc/mysql/my.cnf文件,在 [mysqld] 节中设置:
# Set a connection to wait 8 hours in idle status.
wait_timeout = 86400
第二步设置c3p0
基本上就是这几条
<!-- 当连接池用完时客户端调用获取连接方法后等待获取新连接的时间,超时后将抛出SQLException,如设为0则表示无限期等待,单位毫秒,默认0 <property name="Timeout" value="100"></property> --> <property name="checkoutTimeout" value="100" /> <!-- 初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值,默认为3 --> <property name="initialPoolSize" value="3" /> <!-- 最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0 --> <property name="maxIdleTime" value="25000" /> <!-- 接池中保留的最大连接数。默认为15 --> <property name="maxPoolSize" value="15" /> <!-- JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。但由于预缓存的Statement属 于单个Connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。默认为0 --> <property name="maxStatements" value="0" /> <!-- 连接池内单个连接所拥有的最大缓存Statement数。默认为0 --> <property name="maxStatementsPerConnection" value="0" /> <!-- C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3 --> <property name="numHelperThreads" value="3" /> <!-- 用户修改系统配置参数执行前最多等待的秒数。默认为300 --> <property name="propertyCycle" value="600" /> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="18000" /> <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> <property name="testConnectionOnCheckin" value="true" /> <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。 如果定义了这个参数那么属性preferredTestQuery将被忽略。 你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null <property name="preferredTestQuery" value="SELECT 1" /> --> <property name="automaticTestTable" value="test" />
以上设置完成以后,就应该没啥问题了,我现在还在测试中,明天就有结果了,到时候在更新blog
其他的连接池也应该有类似的问题,可以参照一下 :)
第二天访问的时候果然没有出现连接池的错误了,呵呵,不错。
更多推荐
所有评论(0)