`

mysql 长时间没连接了 就会自动断开服务

阅读更多
Communications link failure due to underlying exception
这是因为mysql 长时间没连接了 就会自动断开服务。
解决办法


1、首先,下载必须的jar包
dbcp 包,目前版本是1.2.1:http://jakarta.apache.org/commons/ dbcp /
pool包,目前版本是1.3:http://jakarta.apache.org/commons/pool/,
如果下载的pool包是1.2的版本,还要下载common-collections包:http://jakarta.apache.org/commons/collections/
在建立我们自己的数据库连接池时,可以使用xml文件来传入需要的参数,这里只使用hard code的方式来简单介绍,所有需要我们自己写的代码很少,只要建立一个文件如下:
import org.apache.commons. dbcp .BasicDataSource;
import org.apache.commons. dbcp .BasicDataSourceFactory;

import java.sql.SQLException;
import java.sql.Connection;
import java.util.Properties;

public class ConnectionSource {
private static BasicDataSource dataSource = null;

public ConnectionSource() {
}

public static void init() {

if (dataSource != null) {
try {
dataSource.close();
} catch (Exception e) {
//
}
dataSource = null;
}

try {
Properties p = new Properties();
p.setProperty("driverClassName", "oracle.jdbc.driver.OracleDriver");
p.setProperty("url", "jdbc:oracle:thin:@192.168.0.1:1521:testDB");
p.setProperty("password", "scott");
p.setProperty("username", "tiger");
p.setProperty("maxActive", "30");
p.setProperty("maxIdle", "10");
p.setProperty("maxWait", "1000");
p.setProperty(" removeAbandoned ", "false");
p.setProperty("removeAbandonedTimeout", "120");
p.setProperty("testOnBorrow", "true");
p.setProperty("logAbandoned", "true");

dataSource = (BasicDataSource) BasicDataSourceFactory.createDataSource(p);

} catch (Exception e) {
//
}
}


public static synchronized Connection getConnection() throws SQLException {
if (dataSource == null) {
init();
}
Connection conn = null;
if (dataSource != null) {
conn = dataSource.getConnection();
}
return conn;
}
}

接下来,在我们的应用中,只要简单地使用ConnectionSource.getConnection()就可以取得连接池中的数据库连接,享受数 据库连接带给我们的好处了。当我们使用完取得的数据库连接后,只要简单地使用connection.close()就可把此连接返回到连接池中,至于为什 么不是直接关闭此连接,而是返回给连接池,这是因为 dbcp 使用委派模型来实现Connection接口了。

在使用Properties来创建BasicDataSource时,有很多参数可以设置,比较重要的还有:

testOnBorrow、testOnReturn、testWhileIdle,他们的意思是当是取得连接、返回连接或连接空闲时是否进行有效性 验证(即是否还和数据库连通的),默认都为false。所以当数据库连接因为某种原因断掉后,再从连接池中取得的连接,实际上可能是无效的连接了,所以, 为了确保取得的连接是有效的,可以把把这些属性设为true。当进行校验时,需要另一个参数:validationQuery,对oracle来说,可以 是:SELECT COUNT(*) FROM DUAL,实际上就是个简单的SQL语句,验证时,就是把这个SQL语句在数据库上跑一下而已,如果连接正常的,当然就有结果返回了。

还有2个参数:timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis,他们两个配合,可以持续更新连接池中的连接对象,当 timeBetweenEvictionRunsMillis 大于0时,每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。
还有其他的一些参数,可以参考源代码。
部分参数简要说明:
removeAbandoned :是否自动回收超时连接
removeAbandonedTimeout:超时时间(以秒数为单位)
rmoveAbandoned=true那么在getNumActive()快要到getMaxActive()的时候,系统会进行无效的 Connection的回收,回收的Connection为removeAbandonedTimeout(默认300秒)中设置的秒数后没有使用的 Connection
logAbandoned:logAbandoned=true的话,将会在回收事件后,在log中打印出回收Connection的错误信息,包括在哪个地方用了Connection却忘记关闭了,在调试的时候很有用。
maxWait:超时等待时间以毫秒为单位
maxIdle:最大空闲连接
minIdle:最小空闲连接
maxActive:最大连接数
testOnBorrow、testOnReturn、testWhileIdle、validationQuery:上面有介绍
另外很重要的一点是每次连接使用完了不要忘了调用connection.close()使连接返回到连接池
分享到:
评论

相关推荐

    nodejs 关于mysql模块 连接超时自动断开解决方法

    nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分

    qt中mysql超时自动断开连解决方案.txt

    可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分

    MYSQL数据库连接偶尔连不上,几秒后又自动恢复

    这种情况虽然不会造成长时间的服务中断,但却会给用户带来不稳定的体验,并可能对应用程序的正常运行造成一定影响。 #### 二、问题分析 此类问题的发生可能由多种因素导致,下面将逐一进行分析: 1. **网络波动**...

    Qt Mysql超时断开后自动重连完美解决方法

    网上找了很多解决办法,几乎没有一个能完美解决问题的,大体都是首先执行一段query后看返回结果,但这个办法也太无用和耗费资源了吧...因为断开后isOpen和isValid都会返回true,所以不能从这里入手...

    MySQL+Hibernate下连接空闲8小时自动断开问题解决方案.docx

    MySQL+Hibernate 连接空闲8小时自动断开问题解决方案 知识点1: Hibernate 的连接池机制 在 Hibernate 中,默认情况下 使用的是 DriverManagerConnectionProvider,这是一个简单的连接池机制。它将打开的连接缓存在...

    ODBC访问MySQL

    ODBC(Open Database Connectivity)是微软推出的一种数据库访问标准,它提供了一种统一的方式来访问不同数据库系统,包括MySQL。在本教程中,我们将探讨如何利用C#语言通过ODBC接口来构建一个简单的数据库应用程序...

    使用数据库连接池proxool配置mysql数据库

    MySQL默认的会话超时时间是8小时,超过这个时间未使用的连接会被自动断开。对于长时间运行的应用,这可能导致连接失效,进而影响应用程序的稳定性。通过使用Proxool,我们可以设置连接的生命周期,确保即使超过了...

    MySQL wait_timeout连接超时

    MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...

    mysql 异常com.mysql.jdbc.CommunicationsException

    异常发生的原因在于MySQL服务器默认设置了一个超时时间(`wait_timeout`),如果一个连接长时间未被使用,则MySQL会自动断开这个连接。在这个案例中,C3P0连接池中的某些连接由于长时间空闲而被MySQL服务器断开,...

    mysql 8小时空闲后连接超时的问题

    当数据库客户端与服务器之间的连接在一定时间内无任何交互(即空闲),MySQL会自动关闭这个连接以释放系统资源。通常,默认的`wait_timeout`参数值为28800秒,即8小时。这种设置对于某些需要长时间保持连接的应用...

    MySQL Sleep连接过多问题解决方法

    2. **超时设置不当**:MySQL服务器有两个参数`wait_timeout`和`interactive_timeout`,分别用于控制非交互式和交互式连接在无活动时多久后自动断开。如果客户端在这些设定的时间内没有发送新的请求,连接会保持在...

    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

    MySQL 数据库在默认配置下,会自动断开长时间未使用的空闲连接,这一特性是为了防止资源浪费和维护数据库系统的稳定性。当空闲时间超过 `wait_timeout` 参数设定的值(默认为8小时,即28800秒)时,MySQL 将关闭该...

    javaee mysql空闲关闭

    然而,为了优化资源使用,MySQL配置了一个参数`wait_timeout`,这个参数定义了连接在空闲多长时间后会被自动关闭。当JavaEE应用中的数据库连接在超过这个设定的时间没有执行任何操作,MySQL服务器会断开这个连接,这...

    用代码判断mysql连接是否能用.zip

    这种方法在长时间运行的进程或Web应用中特别有用,因为它们可能需要定期检查数据库连接的状态,以便在连接丢失后重新建立。 最后,"MySQL中判断连接失效的方法_招财猫_Martin 的专栏-CSDN博客.url"这个标签暗示了...

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    * 对 连接池中的数据库连接(空间时间长的即调度算法)进行`适当`断开连接 * 共享资源的访问,需要`互斥锁`(生产者消费者问题) ## 单例模式 * `懒汉模式` > 当使用这个类的时候才创建它 > 创建对象时,加锁保证有且仅...

    c3p0 重新自动连接c3p0 重新自动连接c3p0 重新自动连接c3p0 重新自动连接

    - **调整 MySQL 的 wait_timeout 参数**:将其设置为更长的时间或者根据应用需求进行调整。 - **调整 c3p0 的 maxIdleTime 和 idleConnectionTestPeriod 参数**:确保这些参数设置得当,以便c3p0能够在MySQL关闭空闲...

    Spring Boot如何解决Mysql断连问题

    Mysql 在发现一个连接空闲时间超过 8 小时,将会在数据库端自动关闭这个连接。这是因为 Mysql 的 wait_timeout 参数的默认值是 8 小时。如果我们不做任何设置,连接将会在 8 小时后断开。 那么,如何解决这个问题呢...

    关于mysql提示too many connections问题解决方法.doc

    如果超过这个时间没有活动,连接将被自动断开。 - `SET GLOBAL interactive_timeout=300`:设置交互式连接的超时时间。与`wait_timeout`类似,但适用于交互式会话,如MySQL客户端。 ### **永久解决方案** 1. **...

    浅析mysql交互式连接&非交互式连接

    MySQL的8小时自动断开异常是由于长时间无活动连接导致的。如果数据库连接池中的连接在超过`wait_timeout`设定的时间后未被使用,MySQL会自动断开这些连接。这可能导致应用程序在尝试使用这些已断开的连接时遇到...

Global site tag (gtag.js) - Google Analytics