系统发布以后,出现了一个奇怪的现象,待机一晚上后,第二天早上第一次登录总是失败。重启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小时。怎么不让它超时呢
本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。数据库连接池是一种资源管理技术,它预先创建并维护一定数量的数据库连接,当应用需要时,可以从池中获取连接,使用完毕...
MySQL数据库的连接超时问题,通常表现为Wait_timeout错误,指的是当客户端与服务器之间的连接在指定时间内没有进行任何数据交互,数据库会自动断开这个连接,以释放资源并防止不必要的资源占用。这一特性在MySQL中是...
MySQL数据库连接池是提高应用程序性能的一种重要技术,它允许开发者管理多个数据库连接并高效地复用这些连接,而不是每次需要时都创建新的连接。在C#编程中,我们可以使用自定义的连接池或者第三方库如ADO.NET的...
本文将深入探讨MySQL数据库连接语句,并提供多种样例,帮助你理解和应用。 在编程中,连接字符串是一种包含所有必要参数的字符串,用于建立应用程序与数据库之间的连接。对于MySQL,这些参数可能包括服务器名称、...
在"java连接mysql数据库连接池demo"这个项目中,我们可以深入探讨以下几个方面: 1. **JDBC**: JDBC是Java平台的标准接口,它允许Java程序与各种数据库进行交互。通过JDBC,开发者可以执行SQL语句,处理结果集,...
MySQL数据库连接驱动包是用于Java应用程序与MySQL数据库交互的关键组件,它遵循JDBC(Java Database Connectivity)标准。在Java编程中,如果你想要访问MySQL数据库,就需要这个驱动包,也称为MySQL Connector/J。...
nodejs 关于mysql模块 连接超时自动断开解决方法,在这块遇到的坑,而且坑了很久才找到的,分享只为求分
在Go语言中连接MySQL数据库,我们需要使用特定的工具包,这个工具包通常被称为`go-sql-driver/mysql`。这个库允许Go程序通过SQL语句与MySQL数据库进行交互。 首先,安装`go-sql-driver/mysql`库。在Go环境中,可以...
连接MySQL数据库是进行数据操作的第一步,这通常涉及到使用特定的API或工具。以下是对MySQL连接数据库涉及的知识点的详细说明: 1. **连接方式**: - **命令行客户端**:这是最基础的连接方式,通过MySQL的命令行...
总结起来,MySQL JDBC驱动和Druid数据库连接池是Java开发中用于高效管理和使用MySQL数据库的关键组件。正确配置和使用它们,可以显著提升应用程序的稳定性和性能。在实际开发中,结合这两个工具,开发者可以构建出更...
MySQL数据库连接池是数据库管理中的一个重要概念,它在Linux环境下被广泛应用。数据库连接池是一种管理数据库连接的技术,通过预先创建并维护一定数量的数据库连接,为应用程序提供高效、可靠的数据库访问服务。它...
### MySQL数据库连接偶尔无法连接问题解析 #### 一、问题背景与现象 在日常使用MySQL数据库的过程中,可能会遇到一种情况:数据库连接偶尔会出现无法连接的情况,但几秒钟之后这种状况又会自动恢复正常。这种情况...
3. **连接泄漏自动关闭**:启用连接泄漏自动关闭功能,可以通过设置“非活动连接超时”属性来实现。例如,设置为30秒表示超过30秒未使用的连接将被自动关闭。这一设置有助于减少泄漏连接对资源的影响。 #### 四、...
* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接...
- `jdbc:mysql://`:URL前缀,标识这是一个MySQL数据库连接。 - `hostname`:MySQL服务器的IP地址或域名。 - `port`:MySQL服务监听的端口号,默认是3306。 - `database`:要连接的数据库名。 - `username`:...
总结,使用Proxool配置MySQL数据库连接池,不仅可以解决8小时连接超时问题,还可以提升应用程序的性能和稳定性。通过详细配置Proxool,我们可以灵活地调整连接池参数以适应不同应用场景的需求,并通过集成到Tomcat,...
在IT行业中,数据库连接是应用程序与数据库交互的基础。"jdbc"是Java Database Connectivity的缩写,它是Java平台标准的一部分,允许Java程序通过JDBC API与各种数据库进行通信。本资源集合了常用的JDBC数据库连接...
自定义数据库连接池还可以考虑支持多种数据库类型,例如SQL Server、MySQL、Oracle等,通过泛型或接口实现对不同数据库的适配。 理解并掌握C#高效数据库连接池的实现,对于开发高性能的数据库应用至关重要。通过...