数据库连接出错信息有下面两条:
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
com.mysql.jdbc.CommunicationsException: Communications link failure
================分割线================
一直想不出什么原因导致,网上查资料也不顺利,后来找到了hibernate连接数据库,产生同样的错误时的处理方法,知道了问题出在哪里:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
上网搜索,在MySQL的论坛上找到一个办法,就是如果在执行sql语句的时候发生了上述异常,就将sql语句重新执行一次。
试验发现,这个办法对这个使用spring+hibernate的服务无效。
进一步搜索发现,MySQL官方不推荐使用autoReconnect=true,参见http://bugs.mysql.com/bug.php?id=5020
需要另外找别的办法来解决这个问题。
由于问题产生的根本原因在于服务到数据库的连接长时间没活动,既然重新连接的办法无效,就可以尝试另外一种办法,就是反空闲。
自己写一个线程来反空闲的话,比较麻烦。
最后在网上找到一个办法。为hibernate配置连接池,推荐用c3p0,然后配置c3p0的反空闲设置idle_test_period,只要小于MySQL的wait timeout即可。
在hibernate.cfg.xml中增加下面几项:
<!-- configuration pool via c3p0-->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.time_out">1800</property> <!-- seconds --><!-- default: 0 -->
<property name="c3p0.max_statement">50</property> <!-- default: 0 -->
<property name="c3p0.acquire_increment">1</property> <!-- default: 1 -->
<property name="c3p0.idle_test_period">120</property> <!-- seconds --><!-- default: 0 -->
<property name="c3p0.validate">true</property>
修改完后测试,问题解决。
================分割线================
具体修改方法如下:
对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参数:autoReconnect=true(如jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true),如果是MySQL5及以后的版本,则需要修改my.cnf(或者my.ini)文件,在[mysqld]后面添加上:
wait_timeout = n
interactive-timeout = n
(n为服务器关闭交互式连接前等待活动的秒数。可是就部署而言每次修改my.ini比较麻烦,而且n等于多少才是合适的呢?所以这个解决办法不好。)
查ibatis文档后修改如下,红字部分是修改的重点:
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL"
value="jdbc:mysql://192.168.1.4:3306/mail?characterEncoding=utf-8" />
<property name="JDBC.Username" value="abc" />
<property name="JDBC.Password" value="abc" />
<property name="Pool.MaximumActiveConnections" value="10" />
<property name="Pool.MaximumIdleConnections" value="5" />
<property name="Pool.MaximumCheckoutTime" value="120000" />
<property name="Pool.TimeToWait" value="500" />
<property name="Pool.PingQuery" value="select 1 from redirect_url" />
<property name="Pool.PingEnabled" value="true" />
<property name="Pool.PingConnectionsOlderThan" value="0" />
<property name="Pool.PingConnectionsNotUsedFor" value="3600000" /><!-- 对于空闲的连接一个小时检查一次 -->
</dataSource>
</transactionManager>
相关推荐
解决“MySQL连接过多”的问题,首先应检查数据库的配置。可以通过登录MySQL服务器并运行`SHOW VARIABLES LIKE 'max_connections';`来查看`max_connections`的设置。同样,使用`SHOW STATUS LIKE 'Threads_connected'...
MySQL无法连接并提示10055错误通常是由于系统或应用程序的连接数达到上限导致的。10055错误是Windows系统中的一个网络错误,全称为"WSAEADDRNOTAVAIL",意味着请求的操作涉及到的套接字地址不是本机接口的。这通常与...
这个问题出现的原因在于MySQL 8.0版本中移除了`query_cache`相关的系统变量和功能,因此在使用新版本的JDBC驱动去连接旧版Mycat(可能基于较早版本的MySQL)时,会因找不到这个变量而抛出错误。 首先,我们需要理解...
本文将以“php+mysql连接数据库”为主题,详细介绍如何使用PHP连接MySQL数据库,并执行基本的数据查询操作。无论是初学者还是有一定基础的开发者都能从中获益。 #### 二、环境搭建与配置 在开始学习之前,我们需要...
5. 如果问题仍未解决,可能需要检查系统的其他依赖项或注册表设置。 了解DLL文件的工作原理和如何处理缺失的DLL文件对于任何使用MySQL的开发人员或系统管理员来说都是重要的知识。此外,为了确保系统的稳定性和安全...
默认情况下,MySQL服务器会在8小时无活动后关闭连接。要解决这个问题,你可以通过设置`wait_timeout`变量来调整超时时间,这可以在启动`mysqld`服务时完成。要检查MySQL服务器的状态,可以运行`mysqladmin version`...
默认情况下,服务器会在8小时无活动后自动断开连接。这可以通过设置`wait_timeout`变量在启动mysqld时进行调整。要检查MySQL服务器是否仍然运行,可以执行`mysqladmin version`命令。如果你的脚本需要长时间运行或...
8. **session管理**:登录成功后,通常会使用session来跟踪已认证的用户,防止未授权的访问。session在服务器端存储用户信息,直到用户注销或session超时。 这个示例对于初学者来说是一个很好的起点,它涵盖了基本...
`Class.forName()`方法用于加载MySQL的JDBC驱动,`DriverManager.getConnection()`方法用于建立实际的数据库连接。 一旦连接成功,你可以执行SQL查询、插入、更新或删除操作。当完成数据库操作后,记得关闭连接以...
如果使用的是旧版的MySQL扩展,查找`extension=mysql`并确保它未被注释。如果找不到这些行,可能需要手动添加。 2. **重启Web服务器**:修改php.ini后,必须重启Web服务器(如Apache或Nginx)以使更改生效。 3. **...
其次,使用DriverManager.getConnection()方法建立与MySQL数据库的连接。这个方法需要三个参数:数据库的URL,用户名和密码。URL定义了要连接的数据库位置,包括数据库服务器地址、端口号以及数据库名。文档中给出的...
2. 连接创建和销毁:连接池需要有方法来创建新的数据库连接(如通过SQL的`mysql_connect()`或`pqxx::connection`),并管理这些连接的生命周期。当连接不再使用时,应确保它们被正确关闭和释放。 3. 连接的获取和...
为了确保代码的健壮性,我们还需要处理可能出现的错误,并在完成操作后关闭数据库连接。这不仅有助于节省资源,还能防止未处理的连接导致的问题。 总的来说,使用Node.js显示MySQL数据库数据的关键步骤包括:安装...
Unidac(Universal Data Access Components)是Devart公司开发的一款数据库连接组件,它提供了一种高效、快速且灵活的方式来访问多种数据库系统,如Oracle、MySQL、SQL Server、PostgreSQL等。Unidac连接池...
4. **异常处理**:当连接出现问题时,DBCP可以自动回收错误的连接,确保连接池的稳定运行。 三、DBUtils Apache Commons DBUtils是Apache软件基金会的一个小型实用工具类库,它是基于JDBC的,简化了数据库操作。...
C API提供了连接管理、查询构造和发送、错误处理等功能,让开发者能够构建自己的MySQL客户端应用程序。 首先,书中强调了编写自定义程序时应考虑的一致性、代码的模块性和可重用性。为了构建一个基本的客户端程序...
本资源提供了 MySQL 错误代码的详细列表,涵盖了从 0101 到 0233 共计 133 个错误代码,每个错误代码都附带了详细的错误信息,帮助开发者快速查找和解决 MySQL 相关的问题。 MySQL 错误代码大全: 1. 0101 - 属于...
4. 连接超时:为防止连接长时间未被释放导致资源浪费,可以设置超时机制,当连接空闲超过特定时间后自动回收。 5. 连接验证:在从池中获取连接时,可能需要进行验证,确保连接仍然有效,如检查网络状态、数据库...
MySQL+JSP登录系统是基于Web的用户身份验证机制,主要结合了数据库管理系统MySQL和服务器端脚本语言JavaServer Pages(JSP)来实现。在这个系统中,用户通过输入账号和密码,系统会验证这些信息是否与存储在数据库中...