数据库连接出错信息有下面两条:
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>
分享到:
相关推荐
**IBATIS数据库连接详解** IBATIS,全称为"Ibatis - A Simple SQL Mapping Framework",是一个优秀的开源Java持久层框架。它简化了在Java应用中处理SQL的过程,提供了SQL Map配置文件,使得开发者能够将SQL语句与...
在使用Mybatis框架进行数据库操作时,可能会遇到`org.apache.ibatis.exceptions.PersistenceException`这样的异常,这通常是由于多种原因导致的。下面将详细分析这个错误的原因并提供相应的解决办法。 一、错误描述...
本案例将深入探讨如何使用Ibatis进行数据库连接,并提供一个实际操作的示例。 Ibatis的核心理念是SQL映射文件,它将数据库操作的SQL语句封装在XML配置文件中,使得SQL逻辑与业务逻辑解耦。首先,我们需要在项目中...
【Ibatis连接数据库的小例子】 Ibatis是一款轻量级的Java持久层框架,它与ORM(对象关系映射)框架Hibernate类似,但更注重SQL的灵活性。Ibatis的主要特点是将SQL语句直接写在配置文件中,使得开发人员能够更好地...
在IT行业中,数据库连接是应用程序的核心部分,尤其是在使用ORM(对象关系映射)框架时,如IBATIS。本文档将深入探讨如何在IBATIS框架下连接和管理多个数据库,以便于在不同环境中灵活切换或同时操作多个数据源。 ...
// 数据库连接 con = DriverManager.getConnection(url, username, password); } catch (SQLException ex) { ex.printStackTrace(); } ``` iBatis 连接设置 iBatis 是一个持久层中间件,提供了多种方式连接...
iBatis,全称为MyBatis iBatis,是一个基于Java的持久层框架,它简化了数据库与应用程序之间的交互,避免了直接编写大量的SQL语句和手动处理结果集。在这个过程中,iBatis提供了一个SQL映射框架,允许开发者将SQL...
在深入探讨ibatis框架中可能遇到的错误时,我们首先需要理解ibatis(现被称为MyBatis)的基本概念。ibatis是一种优秀的持久层框架,它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。ibatis可以使用...
在使用IBatis.net时,首要任务是配置数据库连接。全局配置文件SqlMapConfig.xml是IBatis的入口,用于配置数据源、事务管理器等信息。例如,对于MySQL数据库,可以在SqlMapConfig.xml中添加如下配置: ```xml ...
标题中的“ibatis 连接字符串 SqlMapConfig.xml”指的是使用iBATIS(一个轻量级的Java持久层框架)时,配置数据库连接的关键文件——SqlMapConfig.xml。这个文件是iBATIS的核心配置文件,它包含了数据源、事务管理器...
这里提到的是iBATIS的三个不同版本的jar包:ibatis-2.3.4.726.jar、ibatis-2.3.0.677.jar以及ibatis-2.3.3.720.jar。 首先,让我们深入了解iBATIS的核心概念和功能: 1. **SQL Map配置**:iBATIS的核心是SQL Map...
最后,确保项目的依赖已正确配置,启动项目并测试数据库连接。如果`ibatis.zip`中的项目可以直接运行,那么下载解压后,只需修改`sqlMapConfig.xml`中的数据库配置,即可运行示例。如标题所述,若项目无法正常运行,...
- 配置管理:正确配置数据库连接信息、事务管理及日志记录等是使用IBatis的基础。 - 映射文件设计:设计清晰、可复用的映射文件,可以大大提高代码的可维护性。 - SQL优化:充分利用动态SQL,避免硬编码,提升SQL...
在使用iBatis进行连接查询之前,确保已经正确地配置了iBatis的环境,包括MyBatis的核心库、数据库驱动以及相应的配置文件(如`mybatis-config.xml`)。 2. **创建POJO类**: 如文件中所示,我们有两个实体类:`...
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <!-- 全局配置选项 --> useStatementNamespaces="true" cacheModelsEnabled="true" ...
Java中的数据库连接池是优化数据库访问效率的关键技术之一。它主要解决了频繁创建和关闭数据库连接导致的性能损失和资源浪费。下面将详细讲解数据库连接池的原理和机制。 1. **连接池的基本工作原理** - **资源池...
Struts1.2和iBatis是两个在Java Web开发中广泛应用的开源框架。Struts1.2作为MVC(模型-视图-控制器)架构的一部分,主要用于处理HTTP请求,控制应用程序的流程,而iBatis则是一个持久层框架,它简化了数据库操作,...
IBatis.DataAccess是IBatis.net框架的一部分,主要负责数据库连接和事务管理。这个组件提供了数据库连接池、事务控制以及对数据库操作的支持。1.9.2版本可能包含以下特性: 1. **数据库连接池**:通过高效的数据库...
C#中iBatis连接mySQL使用的DLL