系统发布以后,出现了一个奇怪的现象,待机一晚上后,第二天早上第一次登录总是失败。重启Tomcat 服务器后,虽然当天可以正常使用,但是到第二天问题依旧。
引用
…………………………………
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC rollback failed org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:583)
…………………………….
root cause
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.
…………………………
note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.
从上面的错误我们可以看出Connection.close(),数据库连接关闭了。为什么之前的系统中我们没有发现过这样的错误呢?我们从数据库连接开始排查:
查看 Hibernate 配置文件:
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in one) -->
<property name="connection.pool_size">20</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
在系统中我们使用了数据库连接池来提高数据库的性能。猜测可能是连接池引发的数据库连接问题。顺着这个思路,通过查阅相关得知和MySQL的运行超时有关。
在MySQL Command Line Client中执行show global variables like 'wait_timeout'
我们发现MySQL5将其连接的等待时间(wait_timeout)缺省为28800 seconds,也就是8小时。在wait_timeout秒期间内,数据库连接(java.sql.Connection)一直处于等待状态,如果没有数据库操作,MySQL5就将该连接关闭。这时,应用的连接池仍然合法地持有该连接的引用。当用该连接来进行数据库操作时,就碰到上述错误。这解释了为什么程序第二天不能登录的问题。
为了解决这个问题,对于MySQL5之前的版本,如Mysql4.x,只需要修改连接池配置中的URL,添加一个参数:autoReconnect=true,如果是MySQL5及以后的版本,则需要修改my.ini文件。
查看mysql5的手册,发现对wait_timeout的最大值分别是24天/365天(windows/linux)。我们使用的Windows系统,假设我们要将其设为21天,我们只要修改mysql5的配置文件“my.ini”中的[mysqld]后面添加上: wait_timeout=1814400
重新启动mysql5。
就部署而言每次修改my.ini比较麻烦,怎么才能比较好的解决这个问题呢?由于MySQL自动关闭已打开的连接,如果这时有请求(需要执行读写数据库的操作),连接池就用一个连接去操作数据库,而这个连接在Mysql的连接中并不存在,所以会出现以上的异常。如果一个连接在和Mysql建立连接时能检查就不会有这样的问题了。
网络搜索一番发现了一个开源的数据库连接池proxool,它有两个属性:一个是test-before-use,还有一个是test-after-use,这两个属性就是在使用前和使用后都要进行对连接的检查,如果连接无效就扔掉再创建一个新的连接。
在系统不断升级的过程中,我们常常引入一些新技术,这些技术可能会在某些细节上引发其他技术的问题。MySQL5数据连接超时就是一个很好的例子,这就需要我们不断深入,探索这些技术,对于问题的排查也要从新技术的细节入手。
- 大小: 2.5 KB
分享到:
相关推荐
mysql5将其连接的等待时间(wait_timeout)缺省为8小时。怎么不让它超时呢
MySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时(Wait_timeout)问题总结.pdfMySQL数据库连接超时...
nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分
* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
可以直接通过设置来达到重连问题,方法很简单,里面有复现自动断开连接导致不能正常插入数据的方法,是自己没有积分所以才要积分
这是用连接池技术管理连接oracle数据库的工具类代码,如果想连接MySQL,直接修改配置文件即可。
数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信...
数据库和表的创建和管理;;1.MySQL Workbench MySQL官方的一个图形管理工具,支持数据库的创建、设计、迁移、备份、导出、导入等功能,支持windows、linux、mac主流的操作...Navicat创建、修改和删除MySQL数据库;谢谢
主要介绍了spring boot配置MySQL数据库连接、Hikari连接池和Mybatis的简单配置方法,需要的朋友可以参考下
Navicat for MySQL是一个强大的MySQL数据库管理和开发工具。Navicat为专业开发者提供了一套强大的足够尖端的工具,但它对于新用户仍然是易于学习。使用了极好的图形用户界面(GUI),可以让你用一种安全和更为容易的...
Java开发中DB2、Oracle、SQL Server、Sybase、MySQL等数据库的驱动程序的加载及建立连接
# MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,...
当发向某个MySQL后台的的并发查询超过某个阈值时,会进行超时等待,直到有可用的连接,其中阈值与超时等待的时间都已经参数化,可以动态配置 set backend offline不再显示节点状态 支持set ...
本文主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,分享给大家,具体如下: 错误位置如下 我们改过来 发现就能正常连接 IDEA尝试连接Mysql时失败 在尝试用IDEA连接的Mysql时一直显示连接失败,...
1.支持连接SQL,MYSQL、ACCESS enum DriverTypeEmum{ driverODBC = 0, driverSQLServer, driverACCESS97, driverACCESS2000, driverACCESSXP, driverEND}; 2.连接信息可通过结构体修改 typedef struct ...
MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在权限系统里面进行权限判断。反向DNS解析是耗费时间的,有可能让用户感觉起来很...
Navicat导航貓 - 简体中文版 <br>软件简介:Navicat导航貓是一个强大的MySQL数据库管理和开发工具。Navicat导航貓为专业开发者提供了一套强大的足够尖端的工具,但它对于新用户仍然是易于学习。Navicat,使用了极...
1. 支持多地址分布式部署数据库连接; 2. 支持数据库连接池; 3. 支持数据库字符转义,能保持包括 ' 等字符到数据库 4. 支持客户端编码类型指定,解决中文乱码问题 3. 2013年 版本是原来版本的修正版本; 主要增加功能...
本篇文章主要介绍了Spring Boot如何解决Mysql断连问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
却卡第一个测试上,启动provider服务和Consumer服务,请求接口却始终报zookeeper请求超时错误(dubbo+zookeeper服务端重复调用三次),经过排查,我的问题是出在dao层与数据库连接的问题上(而且provider方还不报错,...