`
seethemoon
  • 浏览: 48364 次
  • 性别: Icon_minigender_1
  • 来自: 钟祥
社区版块
存档分类
最新评论

hibernate mysql连接断开

阅读更多
Mysql自动断开连接问题解决办法--c3p0连接池网络引用 2009-12-25 08:21:19 阅读155 评论0 字号:大中小
MySQL官方不推荐使用autoReconnect=true,参见 http://bugs.mysql.com/bug.php?id=5020
需要另外找别的办法来解决超过8小时,链接断开的问题。

由于问题产生的根本原因在于服务到数据库的连接长时间没活动,既然重新连接的办法无效,就可以尝试另外一种办法,就是反空闲。
自己写一个线程来反空闲的话,比较麻烦。
最后在网上找到一个办法。为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>




[12 Aug 2004 18:46] Mark Matthews
Note: Autoreconnect functionality will be depcreated and eventually removed in future
releases.

The reason this isn't working for your particular case is that the methodolgy for
autoreconnect was changed to be safer after 3.0.11, and is related to autoCommit state,
which will also cause the current 'in-flight' transaction to fail (if you attempt your
transaction again _after_ the failure, the driver will reconnect). Please see the docs for
the explanation on how to correctly use this feature in the 'Troubleshooting' section.

In any case, there is no 100% safe way that a JDBC driver can re-connect automatically if
a TCP/IP connection dies without risking corruption of the database 'state' (even _with_
transactional semantics), which is why this feature will eventually be removed.

The JDBC spec does not specify that a connection is alive no matter what happens to the
underlying network for this very reason.

Clients of JDBC drivers are responsible for dealing with network failures, as only the
application itself (really the developer of the application) 'knows' what the 'correct'
response to a transaction failing due to the network going down is. 'Wait_timeout'
expiring on the server is basically a 'forced' network failure by the server. You can
correct this in a non-robust way by setting 'wait_timeout' higher, however, you as a
developer should be handling SQL exceptions in your code and taking appropriate recovery
actions, not just passing them up the call stack.

Connection errors aways have a SQLState class of '08'. If you detect this, you can get
another connection and retry the transaction (if it is appropriate).

If this is impractical for whatever reason, configure your connection pool to test for
connection 'liveness' and discard connections that are idle longer than whatever you've
set 'wait_timeout' to on the server (all modern connection pools can do this, but the
configuration of them depends on the pool).[1 Jun 2005 15:01] Kirk Wylie
If the argument is that there might be a transaction going, then a pretty simple case can
be made:
- If the connection is in autoCommit mode, it's safe to autoReconnect.
- If the connection is not in autoCommit mode, but there is no open transaction, it's safe
to autoReconnect (since the connection may be pooled).
- If the connection is not in autoCommit mode, and there is an open transaction, then
throw an exception.

This would resolve the concerns which you have with non-autoCommit mode AND preserve
application functionality.

However, I find it a little disturbing that this was changed and there's no notice in the
changelogs that would indicate that this behavior has changed (I just checked since I was
having the same problem). Since this change was likely to break many applications, it
probably should have been added to the CHANGES file.


分享到:
评论

相关推荐

    MySQL+Hibernate下连接空闲8小时自动断开问题解决方案.docx

    MySQL+Hibernate 连接空闲8小时自动断开问题解决方案 知识点1: Hibernate 的连接池机制 在 Hibernate 中,默认情况下 使用的是 DriverManagerConnectionProvider,这是一个简单的连接池机制。它将打开的连接缓存在...

    MySQL+Hibernate下连接空闲8小时自动断开问题解决方案.pdf

    这是因为 DriverManagerConnectionProvider 使用了 Java 的 DriverManager 来管理数据库连接,而 DriverManager 会在连接空闲一段时间后断开连接。 知识点3:解决方案 要解决连接空闲8小时自动断开的问题,可以...

    hibernate C3P0数据源 连接MySQL数据库

    博文链接:https://wxinpeng.iteye.com/blog/203088

    hibernate与连接池

    它能够有效地管理预定义好的JDBC连接,并且能够根据应用的要求自动地创建和断开这些连接。 #### Hibernate与C3P0的结合 Hibernate与C3P0结合使用可以极大地提高应用效率。通过C3P0,可以管理Hibernate使用的数据库...

    hibernate+proxool解决mysql8小时问题(附带jar包)

    在解决MySQL8小时断开连接的问题时,我们需要进行以下步骤: 1. 添加Proxool和MySQL驱动到项目类路径:从提供的压缩包中,可以看到`proxool-0.8.3.jar`和`mysql-connector-java-5.1.6-bin.jar`,这两个jar包分别是...

    hibernate自动重新连接数据库proxool的使用

    当我们遇到数据库连接断开的情况时,`Hibernate`配合`Proxool`可以实现自动重新连接,确保应用的稳定运行。本文将详细介绍如何在`Hibernate`中配置和使用`Proxool`进行自动重新连接数据库。 首先,我们需要理解`...

    Tomcat6连接池配置详解(自动重连)

    此时,Tomcat将能够正确地管理数据库连接,并在连接断开时自动尝试重新建立连接,大大提高了应用的稳定性和可用性。 #### 八、总结 通过上述步骤,我们详细介绍了如何在Tomcat6中配置连接池,并实现了数据库连接的...

    java连接MySql、SqlServer数据库实例

    5. 断开连接:在操作完成后,记得关闭所有打开的资源,包括`ResultSet`、`Statement`和`Connection`,以释放数据库资源。 ```java rs.close(); stmt.close(); conn.close(); ``` 接下来,让我们看看Java连接...

    MySQL数据库连接超时(Wait_timeout)问题总结.pdf

    当应用程序遇到这种问题时,一种常见的解决方案是在数据库连接字符串中添加"autoReconnect=true"选项,试图在断开连接后自动重新连接。然而,对于MySQL 4.0之前的版本,这种方法可能有效,但在较新的MySQL版本中,...

    关于MySQL的wait-timeout连接超时问题报错解决方案.pdf

    如果设置的不当,可能会导致连接超时、连接断开、甚至影响到整个系统的性能。 在解决连接超时问题时,需要注意以下几点: 1. wait_timeout 参数的设置:可以通过 SET 命令来设置 wait_timeout 参数,例如:mysql&gt; ...

    浅析mysql交互式连接&非交互式连接

    1. 调整`wait_timeout`值,增加到更长的时间,以减少因长时间无活动而断开连接的可能性。 2. 使用连接池管理连接,确保在连接被释放回池之前检查其有效性,避免使用已断开的连接。 3. 设置心跳机制,即使在无实际...

    proxool-091.rar

    本文将详细讨论如何在Hibernate4中使用proxool连接池来有效地管理数据库连接,并解决MySQL数据库8小时超时的问题。Proxool是一个轻量级、高性能的数据库连接池,其0.9.1版本是本次讨论的重点。 首先,我们需要了解...

    mysql-connector-java-8.0.15.jar

    这个jar包是Java开发人员在他们的项目中连接到MySQL数据库的关键组件,尤其对于那些使用Java作为后端语言的Web应用、桌面应用或者框架(如Spring、Hibernate等)来说,它是不可或缺的一部分。 首先,我们来深入了解...

    mysql-connector-java-5.1.13-bin.zip

    1. **连接管理**:提供与 MySQL 数据库建立和断开连接的功能。 2. **SQL 执行**:允许执行 SQL 查询、更新、插入等操作。 3. **事务支持**:支持事务的开始、提交、回滚操作,确保数据一致性。 4. **结果集处理**:...

    JDBC实现Mysql自动重连机制的方法详解

    默认情况下,如果一个连接在8小时内未有任何活动,MySQL会自动关闭这个连接。为了解决这个问题,我们可以采取以下几种方法: 1. **配置URL参数**:如果你不使用任何连接池,可以在JDBC连接URL中添加`autoReconnect=...

    Hibernate——符合Java习惯的关系数据库持久化

    - **Detached**: 对象曾是持久化的,但当前Session已被关闭,对象与数据库的连接断开。 ### 5. Hibernate的映射机制 Hibernate通过XML或注解方式实现对象与数据库表的映射,主要包括以下部分: - **实体类(Entity...

    Hibernate笔记

    - 脱管(detached):对象与Session断开,但数据库中仍有对应记录。 10. `saveOrUpdate()`和`merge()`: - `saveOrUpdate()`根据对象的ID和版本号判断是执行`save()`还是`update()`操作。 - `merge()`方法接收一...

    c3p0连接数据jar包

    它提供了数据库连接的自动管理,包括连接的创建、分配、回收和断开,有效地避免了数据库连接资源的浪费。C3P0通过组合(Combining)和池化(Pooling)策略来优化数据库连接的使用,提高了应用的并发性能。 在使用C3...

Global site tag (gtag.js) - Google Analytics