`

myBatis连接MySQL报异常:No operations allowed after connection closed.Connection was i

阅读更多

myBatis连接MySQL报异常:No operations allowed after connection closed.Connection was implicitly closed

 

异常信息

org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
.......
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:
** BEGIN NESTED EXCEPTION **
com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Broken pipe
STACKTRACE:
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
......
** END NESTED EXCEPTION **

原因分析

查看了Mysql的文档,以及Connector/J的文档以及在线说明发现,出现这种异常的原因是:

  Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,Mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。

解决方案

解决的方法有3种:

  1. 增加 wait_timeout 的时间。
  2. 减少 Connection pools 中 connection 的 lifetime。
  3. 测试 Connection pools 中 connection 的有效性。

当然最好的办法是同时综合使用上述3种方法,下面就 DBCP、C3P0 和 simple jdbc dataSource 分别做一说明,假设 wait_timeout 为默认的8小时

DBCP 增加以下配置信息:

复制代码
validationQuery = "select 1"

testWhileIdle = "true"

//some positive integer
timeBetweenEvictionRunsMillis = 3600000

//set to something smaller than 'wait_timeout'
minEvictableIdleTimeMillis = 18000000

//if you don't mind a hit for every getConnection(), set to "true"
testOnBorrow = "true"
复制代码

C3P0 增加以下配置信息:

复制代码
//获取connnection时测试是否有效
testConnectionOnCheckin = true

//自动测试的table名称
automaticTestTable=C3P0TestTable

//set to something much less than wait_timeout, prevents connections from going stale
idleConnectionTestPeriod = 18000

//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
maxIdleTime = 25000

//if you can take the performance 'hit', set to "true"
testConnectionOnCheckout = true
复制代码

simple jdbc dataSource 增加以下配置信息:

复制代码
Pool.PingQuery = select 1

Pool.PingEnabled = true

Pool.PingConnectionsOlderThan = 0

//对于空闲的连接一个小时检查一次
Pool.PingConnectionsNotUsedFor = 3600000
复制代码

其他方案(不推荐)

  对于 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 等于多少才是合适的值呢? 所以并不推荐这个解决办法。)

 

-------------------------相关-------------------------

 

1. 即使在创建Mysql时url中加入了autoReconnect=true参数,一但这个连接两次访问数据库的时间超出了服务器端wait_timeout的时间限制,还是会CommunicationsException: The last packet successfully received from the server was xxx milliseconds ago. 
2. 服务器端的参数可以用 
  show global variables like 'wait_timeout'; 
  set global wait_timeout=10; 
  来进行设置,但是wait_timeout值不应该设的太高. 
3. 较好的策略是对处于idle状态的connection定时发送一个sql,来刷新服务器上的时间戳.这可以使用c3p0r的连接池.http://bzhang.iteye.com/blog/321832 
4. 对于tomcat的server.xml中使用的连接池,http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html,http://commons.apache.org/dbcp/configuration.html使用DBCP的连接池可以采用 
<Resource name="jdbc/test" auth="Container"  
              type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"  
              url="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"  
              username="root" password="test" maxActive="500" maxIdle="10"  
              maxWait="-1" timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" /> 
  4.1 设置validationQuery,这样每次borrow(默认为开启)时会通过这个sql校验连接的有效性,但是增加了时间. 
  4.2 设置timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" 依赖evictor thread线程来把超时的连接关闭. 
  4.3 设置testWhileIdle="true" timeBetweenEvictionRunsMillis="10000" validationQuery="select 1" 使得定时去用query检测处于idle状态的连接,也就刷新了服务器端的时间. 

5.每次提交的最大packet大小 
show global variables like 'max_allowed_packet'; 
set global max_allowed_packet=1024*1024; 

6. SQLyog 中连接参数的设置 
  6.1 在SQLyog中的设置 set autocommit=0,这样当前连接的自动提交为false,可以控制事务了. 
  6.2 begin; 事务开始 
  6.3 select * from test where 1=1 and id =1 for update;这样就把选到的记录行锁上了,再开一个SQLyog,也执行以上相同的操作,就会一直wait在那里. 
  6.4 commit; 提交 
  6.5 rollback; 回滚 
  6.6 set autocommit=0;后应该加上 
      set transaction isolation level read committed; 
      这样其它客户端就能看到commit的数据, 
  疑问: 
      如果不设置set transaction isolation level read committed;如果两个客户端都select 相同的数据,一个客户端修改然后提交,另一个客户端不提交当前事务的前提下,去执行select ,取不到另一客户端提交的数据,不知道SQLyog默认的事务级别是什么样的. 

7. SQLyog中查看mysql的状态,show global variables like '%lock%'; 是个好方法.对于事务锁(例如for update)报Lock wait timeout exceeded ,只能通过修改my.ini文件innodb_lock_wait_timeout = 100;才能生效. 

8. linux下修改用户密码 mysqladmin -u root password "new_pass"

分享到:
评论

相关推荐

    mybatis连接MySQL8出现的问题解决方法

    "mybatis连接MySQL8出现的问题解决方法" MyBatis是当前最流行的持久层框架之一,它提供了一个简单的方式来访问数据库。然而,在使用MyBatis连接MySQL8时,可能会出现一些问题。本文将介绍MyBatis连接MySQL8出现的...

    IDEA离线安装MybatisX插件,IDEA版本:IntelliJ IDEA Ultimate 2021.1.3

    IDEA离线安装MybatisX插件(MybatisX-1.1.2至1.4.17),...mybatis.xml,mapper.xml 提示 mapper 和 xml 支持类似 jpa 的自动提示(参考 MybatisCodeHelperPro) 集成 mybatis 生成器 Gui(来自免费的 mybatis 插件)

    mybatis 连接mysql数据库时所需所有jar包

    本文将详细讲解如何使用MyBatis连接MySQL数据库,并介绍在该过程中所需的jar包及其作用。 首先,我们要了解MyBatis的核心组件`mybatis-3.4.5.jar`。这个文件是MyBatis框架的主库,包含了所有核心功能,如SQL映射...

    MySql练习1:使用纯Java方式连接数据库.zip

    在本实践项目中,我们将探讨如何使用纯Java代码来连接MySQL数据库。这是一项基础但至关重要的技能,对于任何想要在Java应用程序中与数据库交互的开发者来说都是必要的。MySQL是一个广泛使用的开源关系型数据库管理...

    SpringBoot + MyBatis + MySQL + Vue的教育培训机构管理系统源码.zip

    后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementUI 教育培训机构管理系统,此系统为前后端分离方式开发的系统,技术栈为: 后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementUI 教育...

    day01_eesy_01mybatis.zip

    学习笔记——mybatis的起步(1) 1.什么是框架? 他是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高...

    IDEA离线安装MybatisX-1.5.x插件,IDEA版本:IntelliJ IDEA Ultimate 2021.1.3

    IDEA离线安装MybatisX-1.5.x插件(MybatisX-1.5.0、Mybatis...mybatis.xml,mapper.xml 提示 mapper 和 xml 支持类似 jpa 的自动提示(参考 MybatisCodeHelperPro) 集成 mybatis 生成器 Gui(来自免费的 mybatis 插件)

    教育培训机构管理系统,技术栈:SpringBoot + MyBatis + MySQL + Vue + ElementUI

    后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementUI 此系统为前后端分离方式开发的系统,技术栈为 后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementUI 此系统为前后端分离方式开发的系统,...

    mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip

    mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip mybatis-plus最新代码生成器项目源码 :mybatis-plus-generator.zip ...

    音乐网站 SpringBoot + MyBatis + MySql + Vue

    后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementPlus + Echarts 此系统为前后端分离方式开发的系统,技术栈为 后端: SpringBoot + MyBatis + MySQL 前端: Vue + ElementPlus + Echarts 此系统为...

    springboot+mybatis+mysql最简单demo

    springboot+mybatis+mysql最简单demospringboot+mybatis+mysql最简单demospringboot+mybatis+mysql最简单demospringboot+mybatis+mysql最简单demospringboot+mybatis+mysql最简单demospringboot+mybatis+mysql最简单...

    MyBatis详解_与配置MyBatis

    MyBatis 详解与配置 MyBatis MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的 JDBC 代码、手工设置参数和结果集重获。MyBatis 只使用简单的 XML 和注解来配置和映射基本...

    SpringBoot + MyBatis + MySQL + Vue的案例论文管理系统

    此系统为前后端分离方式开发的系统,技术栈为:后端: SpringBoot + MyBatis + MySQL+redis前端: Vue + BootStrap此系统为前后端分离方式开发的系统,技术栈为:后端: SpringBoot + MyBatis + MySQL+redis前端: ...

    Spring Boot 升级2.x报异常:IllegalArgumentException: jdbcUrl is required with driverClassName.

    原来使用Spring Boot 1.x版本,升级2.x之后,报如下异常: ### Cause: java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName. at org.mybatis.spring.MyBatisExceptionTranslator....

    mybatis 3.2.6

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mybatis+mysql驱动.rar

    总的来说,这个压缩包为开发者提供了MyBatis框架的两个版本和MySQL的Java驱动,涵盖了数据库连接、SQL执行和对象映射等功能,是Java Web开发中数据库操作的基础工具。理解并熟练使用这些组件,能够提升开发效率,...

    mybatis-3-config/mapper.dtd 解决mybatis头文件报错

    &gt;Window-&gt;prefenrence-&gt;XML-&gt;XML Catalog-&gt;User Specifiled Entreis-&gt;Add-&gt;Location(此处是你放dtd文件的位置例如:‪D:\mybatis\mybatis-3-config.dtd)-&gt;Key(如果更改config,此处应该是:-//mybatis.org//DTD ...

    Mybatis破MySql8小时断线问题1

    标题 "Mybatis破MySql8小时断线问题1" 指的是在使用Mybatis框架与MySQL数据库交互时遇到的一个常见问题,即由于MySQL数据库的连接超时机制导致的8小时断线。描述中提到,当数据库连接闲置时间超过MySQL默认设定的8...

    毕设项目:基于SpringBoot+MyBatis+mysql的飞机订票系统.zip

    毕设项目:基于SpringBoot+MyBatis+mysql的飞机订票系统 毕设项目:基于SpringBoot+MyBatis+mysql的飞机订票系统 毕设项目:基于SpringBoot+MyBatis+mysql的飞机订票系统 毕设项目:基于SpringBoot+MyBatis+mysql的...

    IDEA中用Mybatis连接MySQL实例

    IDEA中用Mybatis连接MySQL实例

Global site tag (gtag.js) - Google Analytics