mysql数据库做连接池出现8小时超时问题

跟着太阳奔跑 2015-01-21 06:03:15
最近在做测试的时候,tomcat经常会出现下面一堆数据库异常信息,
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 11,156 milliseconds ago. The last packet sent successfully to the server was 1 milliseconds ago.
at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3589)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3478)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4019)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2683)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2144)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2310)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
at com.unionpay.cloudPayment.dao.PosSignInDao.select(PosSignInDao.java:84)
at com.unionpay.cloudPayment.bll.TransMsgLogBll.getMaxTraceNo(TransMsgLogBll.java:689)
at com.unionpay.cloudPayment.util.TraceNoUtil.genTraceNo(TraceNoUtil.java:14)
at com.unionpay.cloudPayment.wallet.msg.WalletMsgFactory.getServiceQueryReqMsg(WalletMsgFactory.java:45)
at com.unionpay.cloudPayment.wallet.servlet.ServiceQuery.doServiceQuery(ServiceQuery.java:78)
at com.unionpay.cloudPayment.wallet.servlet.ServiceQuery.doPost(ServiceQuery.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3036)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3489)
... 28 more

我系统都放在linux服务器上,我系统比较简单,就是一个servlet作为控制器的web系统,加上socket通信,
经过百度后知道大概意思是数据库连接由于超过连接的有效时间,变成了无效的连接,当再次请求时就会出现这种错误,
我查过了mysql的超时时间是14天,但是我启动tomcat没多久就会出现这种情况
在网上找了很多办法,第一种就是设置c3p0连接的有效时间MaxIdleTime=1800,启动一段时间仍然有这个错误,
于是尝试加上另外一个配置,就是每次执行数据库操作钱,执行一条简单的sql语句,

setPreferredTestQuery("select 1");

我是这样做的,但是重启tomcat一段时间后,继续出现上边的问题,而我数据库设置的超时时间为14天,所以不太理解为什么这么快就出错了,
求大神支招。。。。。。。。。。
...全文
1302 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
最闲程序员 2017-07-13
  • 打赏
  • 举报
回复
怎么解决了呢?我修改了等待时间后还会有时候回出现这个情况? 能分享下解决方案么?
跟着太阳奔跑 2015-08-17
  • 打赏
  • 举报
回复
引用 14 楼 u011263966 的回复:
解决了吗,我也是这个问题
解决了,是别人程序也在使用我的数据库,每次建立连接后没有关闭,导致连接满了
逆天先生 2015-04-26
  • 打赏
  • 举报
回复
解决了吗,我也是这个问题
yanzhenhua1328 2015-02-06
  • 打赏
  • 举报
回复
检索出现的问题,并发数超出了你的做大限制。
深蓝1202 2015-02-06
  • 打赏
  • 举报
回复
mysql 连接数超限 查看代码 使用完之后将statment rs conn全部关闭掉。 检查mysql连接数目方式:利用xshell 等连接工具,连接mysql ,使用以下命令 show status like '%Threads_connected%'; 当前连接数 show status like '%Connections%'; 试图连接数量,不管是否成功 show status like '%Max_used_connections%'; 服务器启动后已同时使用的最大连接数
跟着太阳奔跑 2015-01-28
  • 打赏
  • 举报
回复
引用 10 楼 hewenya12 的回复:
[quote=引用 9 楼 ekekyn 的回复:] [quote=引用 4 楼 Inhibitory 的回复:] DBCP 的配置,MySQL 8小时问题已经解决,亲测 似乎在某些时候还是会出现此类问题
我觉得还是数据库查询的代码的问题,等待稍后还会不会出现[/quote] 真的无力了,没找到原因
跟着太阳奔跑 2015-01-27
  • 打赏
  • 举报
回复
引用 9 楼 ekekyn 的回复:
[quote=引用 4 楼 Inhibitory 的回复:] DBCP 的配置,MySQL 8小时问题已经解决,亲测 似乎在某些时候还是会出现此类问题
我觉得还是数据库查询的代码的问题,等待稍后还会不会出现
ekekyn 2015-01-23
  • 打赏
  • 举报
回复
[quote=引用 4 楼 Inhibitory 的回复:] DBCP 的配置,MySQL 8小时问题已经解决,亲测 似乎在某些时候还是会出现此类问题
跟着太阳奔跑 2015-01-23
  • 打赏
  • 举报
回复
还是偶尔出现这种错误,这可是致命的
  • 打赏
  • 举报
回复
引用 4 楼 Inhibitory 的回复:
DBCP 的配置,MySQL 8小时问题已经解决,亲测
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 1. Data source config -->
    <!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
        <!--<property name="driverClassName" value="com.mysql.jdbc.Driver" />-->
        <!--<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />-->
        <!--<property name="username" value="root" />-->
        <!--<property name="password" value="root" />-->
    <!--</bean>-->

    <!-- 1. Data Source using DBCP. -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
        <property name="username" value="root" />
        <property name="password" value="root" />

        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="10" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="100" />
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="50" />
        <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="5" />
        <!--#给出一条简单的sql语句进行验证-->
        <property name="validationQuery" value="select NOW()" />
        <!--#在取出连接时进行有效验证-->
        <property name="testOnBorrow" value="false" />
        <property name="testWhileIdle" value="true" />
        <property name="logAbandoned" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="120" />
        <!-- #运行'判断连接超时任务'的时间间隔,单位为毫秒,默认为-1,即不执行任务。 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <!-- #连接的超时时间,默认为半小时。 -->
        <property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>

    <!-- 2. SQL session factory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mapper/**/*.xml" /> <!-- Mapper xml -->
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="basePackage" value="mapper" />
    </bean>

    <!-- Enable Transaction -->
    <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
        <!--<property name="dataSource" ref="dataSource" />-->
    <!--</bean>-->
    <!--<tx:annotation-driven transaction-manager="transactionManager"/>-->
</beans>
思路比较好。
跟着太阳奔跑 2015-01-22
  • 打赏
  • 举报
回复
引用 3 楼 t_jl1979 的回复:
设个定时任务,每隔30分钟执行一下查询操作。
设个锤子,这不到30分钟就出错了
跟着太阳奔跑 2015-01-22
  • 打赏
  • 举报
回复
引用 4 楼 Inhibitory 的回复:
DBCP 的配置,MySQL 8小时问题已经解决,亲测
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 1. Data source config -->
    <!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
        <!--<property name="driverClassName" value="com.mysql.jdbc.Driver" />-->
        <!--<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />-->
        <!--<property name="username" value="root" />-->
        <!--<property name="password" value="root" />-->
    <!--</bean>-->

    <!-- 1. Data Source using DBCP. -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
        <property name="username" value="root" />
        <property name="password" value="root" />

        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="10" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="100" />
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="50" />
        <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="5" />
        <!--#给出一条简单的sql语句进行验证-->
        <property name="validationQuery" value="select NOW()" />
        <!--#在取出连接时进行有效验证-->
        <property name="testOnBorrow" value="false" />
        <property name="testWhileIdle" value="true" />
        <property name="logAbandoned" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="120" />
        <!-- #运行'判断连接超时任务'的时间间隔,单位为毫秒,默认为-1,即不执行任务。 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <!-- #连接的超时时间,默认为半小时。 -->
        <property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>

    <!-- 2. SQL session factory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mapper/**/*.xml" /> <!-- Mapper xml -->
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="basePackage" value="mapper" />
    </bean>

    <!-- Enable Transaction -->
    <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
        <!--<property name="dataSource" ref="dataSource" />-->
    <!--</bean>-->
    <!--<tx:annotation-driven transaction-manager="transactionManager"/>-->
</beans>
但是我用的不是DBCP,我用的c3p0,而且没用spring 等框架,纯jdbc
Inhibitory 2015-01-21
  • 打赏
  • 举报
回复
DBCP 的配置,MySQL 8小时问题已经解决,亲测
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 1. Data source config -->
    <!--<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">-->
        <!--<property name="driverClassName" value="com.mysql.jdbc.Driver" />-->
        <!--<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />-->
        <!--<property name="username" value="root" />-->
        <!--<property name="password" value="root" />-->
    <!--</bean>-->

    <!-- 1. Data Source using DBCP. -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
        <property name="username" value="root" />
        <property name="password" value="root" />

        <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="10" />
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="100" />
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="50" />
        <!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="5" />
        <!--#给出一条简单的sql语句进行验证-->
        <property name="validationQuery" value="select NOW()" />
        <!--#在取出连接时进行有效验证-->
        <property name="testOnBorrow" value="false" />
        <property name="testWhileIdle" value="true" />
        <property name="logAbandoned" value="true" />
        <property name="removeAbandoned" value="true" />
        <property name="removeAbandonedTimeout" value="120" />
        <!-- #运行'判断连接超时任务'的时间间隔,单位为毫秒,默认为-1,即不执行任务。 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000" />
        <!-- #连接的超时时间,默认为半小时。 -->
        <property name="minEvictableIdleTimeMillis" value="3600000" />
    </bean>

    <!-- 2. SQL session factory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:mapper/**/*.xml" /> <!-- Mapper xml -->
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        <property name="basePackage" value="mapper" />
    </bean>

    <!-- Enable Transaction -->
    <!--<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
        <!--<property name="dataSource" ref="dataSource" />-->
    <!--</bean>-->
    <!--<tx:annotation-driven transaction-manager="transactionManager"/>-->
</beans>
冥王之锤 2015-01-21
  • 打赏
  • 举报
回复
设个定时任务,每隔30分钟执行一下查询操作。
跟着太阳奔跑 2015-01-21
  • 打赏
  • 举报
回复
没人吗
跟着太阳奔跑 2015-01-21
  • 打赏
  • 举报
回复
自己顶一个,数据库连接用的c3p0数据连接池

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧