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模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分
可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分
这种情况虽然不会造成长时间的服务中断,但却会给用户带来不稳定的体验,并可能对应用程序的正常运行造成一定影响。 #### 二、问题分析 此类问题的发生可能由多种因素导致,下面将逐一进行分析: 1. **网络波动**...
网上找了很多解决办法,几乎没有一个能完美解决问题的,大体都是首先执行一段query后看返回结果,但这个办法也太无用和耗费资源了吧...因为断开后isOpen和isValid都会返回true,所以不能从这里入手...
MySQL+Hibernate 连接空闲8小时自动断开问题解决方案 知识点1: Hibernate 的连接池机制 在 Hibernate 中,默认情况下 使用的是 DriverManagerConnectionProvider,这是一个简单的连接池机制。它将打开的连接缓存在...
ODBC(Open Database Connectivity)是微软推出的一种数据库访问标准,它提供了一种统一的方式来访问不同数据库系统,包括MySQL。在本教程中,我们将探讨如何利用C#语言通过ODBC接口来构建一个简单的数据库应用程序...
MySQL默认的会话超时时间是8小时,超过这个时间未使用的连接会被自动断开。对于长时间运行的应用,这可能导致连接失效,进而影响应用程序的稳定性。通过使用Proxool,我们可以设置连接的生命周期,确保即使超过了...
MySQL的`wait_timeout`连接超时问题通常出现在长时间无操作的数据库连接上,服务器会自动关闭这些连接以释放资源。这种现象在应用中可能导致突然的数据通信中断,表现为“Communications link failure”等错误,提示...
异常发生的原因在于MySQL服务器默认设置了一个超时时间(`wait_timeout`),如果一个连接长时间未被使用,则MySQL会自动断开这个连接。在这个案例中,C3P0连接池中的某些连接由于长时间空闲而被MySQL服务器断开,...
当数据库客户端与服务器之间的连接在一定时间内无任何交互(即空闲),MySQL会自动关闭这个连接以释放系统资源。通常,默认的`wait_timeout`参数值为28800秒,即8小时。这种设置对于某些需要长时间保持连接的应用...
2. **超时设置不当**:MySQL服务器有两个参数`wait_timeout`和`interactive_timeout`,分别用于控制非交互式和交互式连接在无活动时多久后自动断开。如果客户端在这些设定的时间内没有发送新的请求,连接会保持在...
MySQL 数据库在默认配置下,会自动断开长时间未使用的空闲连接,这一特性是为了防止资源浪费和维护数据库系统的稳定性。当空闲时间超过 `wait_timeout` 参数设定的值(默认为8小时,即28800秒)时,MySQL 将关闭该...
然而,为了优化资源使用,MySQL配置了一个参数`wait_timeout`,这个参数定义了连接在空闲多长时间后会被自动关闭。当JavaEE应用中的数据库连接在超过这个设定的时间没有执行任何操作,MySQL服务器会断开这个连接,这...
这种方法在长时间运行的进程或Web应用中特别有用,因为它们可能需要定期检查数据库连接的状态,以便在连接丢失后重新建立。 最后,"MySQL中判断连接失效的方法_招财猫_Martin 的专栏-CSDN博客.url"这个标签暗示了...
* 对 连接池中的数据库连接(空间时间长的即调度算法)进行`适当`断开连接 * 共享资源的访问,需要`互斥锁`(生产者消费者问题) ## 单例模式 * `懒汉模式` > 当使用这个类的时候才创建它 > 创建对象时,加锁保证有且仅...
- **调整 MySQL 的 wait_timeout 参数**:将其设置为更长的时间或者根据应用需求进行调整。 - **调整 c3p0 的 maxIdleTime 和 idleConnectionTestPeriod 参数**:确保这些参数设置得当,以便c3p0能够在MySQL关闭空闲...
Mysql 在发现一个连接空闲时间超过 8 小时,将会在数据库端自动关闭这个连接。这是因为 Mysql 的 wait_timeout 参数的默认值是 8 小时。如果我们不做任何设置,连接将会在 8 小时后断开。 那么,如何解决这个问题呢...
如果超过这个时间没有活动,连接将被自动断开。 - `SET GLOBAL interactive_timeout=300`:设置交互式连接的超时时间。与`wait_timeout`类似,但适用于交互式会话,如MySQL客户端。 ### **永久解决方案** 1. **...
MySQL的8小时自动断开异常是由于长时间无活动连接导致的。如果数据库连接池中的连接在超过`wait_timeout`设定的时间后未被使用,MySQL会自动断开这些连接。这可能导致应用程序在尝试使用这些已断开的连接时遇到...