前段时间 现网忽然频繁报出 链接不上数据库,偶滴的妖孽,其余地方都是用mysql,也没遇到这个问题呀。java
java.io.EOFExceptionat at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2803) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
场景出现的理论依据
MySQL 的默认设置下,当一个链接的空闲时间超过8小时后,MySQL 就会断开该链接,而 c3p0/dbcp 链接池则觉得该被断开的链接依然有效。在这种状况下,若是客户端代码向c3p0/dbcp 链接池请求链接的话,链接池就会把已经失效的链接返回给客户端,客户端在使用该失效链接的时候即抛出异常。mysql
若是你只是个程序员,你会想着,在去对数据库作操做前,我不是先对数据库链接作个校验或判断什么的,链接是working的,我才干活,那么你获得的解决方案-或许就是这样的程序员
#c3p0配置 <!--最大空闲时间,60秒内未使用则链接被丢弃。若为0则永不丢弃。默认值: 0 --> <property name="maxIdleTime">60</property> <!-- 当链接池链接耗尽时,客户端调用getConnection()后等待获取新链接的时间, 超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 0 --> <property name="checkoutTimeout" value="3000"/> <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。 若是定义了这个参数那么属性preferredTestQuery将被忽略。 你不能在这张Test表上进行任何操做,它将只供c3p0测试使用。默认值: null --> <property name="automaticTestTable">Test</property> <!--因性能消耗大请只在须要的时候使用它。若是设为true那么在每一个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提高链接测试的性能。Default: false --> <property name="testConnectionOnCheckout">false</property> <!--若是设为true那么在取得链接的同时将校验链接的有效性。Default: false --> <property name="testConnectionOnCheckin">true</property> <!--每60秒检查全部链接池中的空闲链接。Default: 0 --> <property name="idleConnectionTestPeriod">60</property>
若是你只是个DBA,你会想着,为何数据库链接本身断了,是否是哪里有配置,我得去看看,那么你获得的解决方案-可能就是这样的sql
#my.cnf wait_timeout=31536000 interactive_timeout=31536000
加大wait_timeout的时间。数据库
But 现实环境中须要你考虑的是:性能
我的当前以为此题 第一需考虑的是:
你业务当前高峰期mysql_connection是多少?保留多久connection在高峰期都不会撑爆你数据库链接池?
若是你知道这个池-那么是改mysql ?仍是改c3p0?仍是左右开弓都是有据可循且不会带来后遗症的-最佳解决方案测试
如我当前有环境,一个现网的后台管理系统,使用人数在50之内,那么我wait_timeout 就是默认8小时,c3p0不用作链接有效性检查等,都是万事ok的。code
而我还有一个EPG前台管理系统,用户量在300万之内,若是我wait_timeout为8小时,那我一到高峰期确定就是死翘翘的,会有太多的TCP链接没关闭,
数据库链接数确定是不够的。
因EPG的一个访问-一次对数据库操做量不大,查询完数据就完成ok啦,wait_timeout 设置在120s内应该是够用啦,那么相对应的c3p0中 设置小于wait_timeout 的时间有效性检查 -就能确保获取到链接是有效的。get
请根据业务场景,来配置参数,不要解决了A问题,带来了B问题。it
做者:灼灼2015 连接:https://www.jianshu.com/p/69dcae4454b3 來源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。