发信人: Neverwinter (nez@Atlantis), 信区: Database
标 题: [原创]一个MySQL连接问题的解决
发信站: 北邮人论坛 (Tue Sep 5 19:34:07 2006), 站内
【 以下文字转载自 SoftDesign 讨论区 】
发信人: Neverwinter (nez@Atlantis), 信区: SoftDesign
标 题: [原创]一个MySQL连接问题的解决
发信站: 北邮人论坛 (Fri Sep 1 17:32:13 2006), 站内
使用Spring+Hibernate开发的一个J2EE服务,数据库使用MySQL 5.0,部署容器是Tomcat 5.5。
一般情况下,服务运行正常。但是如果长时间没有连接连上服务器,过一段时间后再次连接就会失败。但是重启Tomcat服务器,服务又会正常运行。
Log中的输入(部分)如下:
2006-08-28 14:34:31,981 ERROR [org.springframework.transaction.interceptor.TransactionInterceptor] - <Application exception overridden by rollback exception>
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute query; uncategorized SQLException for SQL [select userprofil0_.uid as uid6_, userprofil0_.name as name6_, userprofil0_.mails as mails6_, userprofil0_.phones as phones6_, userprofil0_.mobiles as mobiles6_, userprofil0_.addrs as addrs6_, userprofil0_.gender as gender6_, userprofil0_.age as age6_, userprofil0_.vs_path as vs9_6_, userprofil0_.passwd as passwd6_, userprofil0_.logo_path as logo11_6_, userprofil0_.vs_size as vs12_6_ from user_profile userprofil0_ where userprofil0_.uid=? and userprofil0_.passwd=?]; SQL state [08003]; error code [0]; 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: Software caused connection abort: socket write error
STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2739)
......
Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2757)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2650)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1581)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1695)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3004)
......
从log中可以看出,Tomcat服务器与MySQL服务器之间已经失去连接。
上网搜索,发现原来MySQL wait timeout的值默认是28800 (3600*8),即一个连接在8小时内没有活动,就会自动断开该连接。
wait timeout的值可以设定,但最多只能是32767,不能再大了。
然后搜到解决这个问题的一个办法是在hibernate.cfg.xml中,在url的连接后加上autoReconnect=true
修改url后再试,还是有错误,不过有所变化:
2006-08-30 15:40:31,109 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 0, SQLState: 08S01>
2006-08-30 15:40:31,109 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: socket write error
STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
......
Last packet sent to the server was 0 ms ago.>
2006-08-30 15:40:31,109 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/ds].[ds]] - <Servlet.service() for servlet ds threw exception>
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not execute query; uncategorized SQLException for SQL [select userprofil0_.uid as uid6_, userprofil0_.name as name6_, userprofil0_.mails as mails6_, userprofil0_.phones as phones6_, userprofil0_.mobiles as mobiles6_, userprofil0_.addrs as addrs6_, userprofil0_.gender as gender6_, userprofil0_.age as age6_, userprofil0_.vs_path as vs9_6_, userprofil0_.passwd as passwd6_, userprofil0_.logo_path as logo11_6_, userprofil0_.vs_size as vs12_6_ from user_profile userprofil0_ where userprofil0_.uid=? and userprofil0_.passwd=?]; SQL state [08S01]; error code [0]; Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketException
MESSAGE: Software caused connection abort: socket write error
STACKTRACE:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2739)
......
上网搜索,在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>
修改完后测试,问题解决。
--
[QMD No. 2]
程序是程序员才有的高尚爱好
程序是程序员才懂的欣赏的艺术
程序是只有程序员才能领悟的哲学
程序是永远的程序员的思维的结晶
作为程序员应该以自己是程序员而骄傲
分享到:
相关推荐
nested exception is java.lang.NoClassDefFoundError_kmode exception" 指出的问题,是Java开发中常见的错误,通常发生在运行时。这个错误表明系统在尝试执行某个类时找不到对应的类定义。`NoClassDefFoundError` ...
Java程序在运行过程中可能会遇到各种异常,其中"nested exception is java.lang.OutOfMemoryError: Java heap space"是一个常见的问题,通常发生在程序试图分配超过堆内存限制的空间时。这个错误表明Java虚拟机(JVM...
nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的主要原因是手动对数据库做了些操作,导致...
MySQL中的Nested-Loop Join(NLJ)是一种基本的JOIN操作实现方式,主要用于处理两个或多个表之间的连接。NLJ的基本思想是逐行遍历一张表(称为外部表),然后对每一行与另一张表(称为内部表)进行匹配。这个过程...
nested exception is com.sun.jersey.api.client.UniformInterfaceException: PUT http://localhost:8090/picServer/uploads/QQ截图20200220003029.png returned a response status of 400 Bad Request type ...
然后是Hibernate的配置文件(hibernate.cfg.xml),其中包含了数据库连接信息以及实体类的映射定义。接着,要关注实体类的设计,这些类通常会使用Hibernate的注解来指定与数据库表的映射关系。 在数据库脚本方面,...
NULL 博文链接:https://jilongliang.iteye.com/blog/1907524
- nested throwable错误解决方案 在Jboss应用服务器中,启动报错Failed to parse WEB-INF/web.xml; - nested throwable是一种常见的错误,本文将对此错误进行深入分析,并提供解决方案。 错误原因 Jboss应用...
错误九:Exception in thread "main" org.hibernate.TransactionException: nested transactions not supported 错误原因:Hibernate不支持嵌套事务,即在一个事务中开启另一个事务。这通常是由于在已经处于事务...
Hibernate是一个开源的对象关系映射(ORM)框架,用于Java语言开发。它提供了Java应用程序与关系型数据库之间的映射关系,大大简化了数据库编程。Hibernate 4是该框架的一个版本,它涵盖了关系映射、事务处理、原理...
nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class ``` 这表示Hibernate找不到实体类中的 ID 属性的 getter 方法。 **解决方法**: 1. **实体类定义**:...
在Java程序中,`java.lang.OutOfMemoryError: Java heap space` 是一个常见的错误,意味着程序在运行过程中耗尽了JVM分配的堆内存。这个错误通常发生在创建大量对象或者单个对象占用过多内存时。 一、问题描述与...
标题中的"endorsed 解决soa连接错误"指的是在Java环境中,通过使用endorsed目录机制来解决SOA(Service-Oriented Architecture,面向服务架构)连接时遇到的问题。SOA是一种设计原则,允许应用程序组件之间通过网络...
2、连接数超过系统最大连接数 3、Can’t connect to local MySQL server through socket ‘/Data/mydata/mysql.sock’ socket文件目录不对应导致的问题 4、今天要说的就是 没有打开only_full_group_by Cause:...
nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'transactionManagerBeanName' of bean class [org.springframework.transaction.interceptor....
若依整合Ureport2导出报表提示 Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 的解决文档说明
nested exception is: java.net.BindException: Address already in use: JVM_Bind 这里说的是1099端口被其它进程占用了. 二.解决办法 找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口...
7. // 如果不用此包,在启动时抛 出:nested exception is java.lang.NoClassDefFoundError: org/aspectj /weaver /reflect/ReflectionWorld$ReflectionWorldException 8. aspectjweaver.jar 9. 10. //如果不用此...
在本案例中,我们关注的是Spring中的Nested事务,这是一个相对复杂的特性,但非常有用,特别是在需要子事务处理的场景下。下面将详细解释这个概念。 Nested事务是基于JDBC的Savepoint机制实现的,它可以让我们在一...
Struts-Hibernate-Nested-Demo 是一个基于Java的Web应用程序示例,主要展示了如何使用Struts框架、JSTL(JavaServer Pages Standard Tag Library)以及Hibernate ORM(对象关系映射)来处理数据库中的主从表关系。...