`
bzhang
  • 浏览: 254983 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Mysql autoReconnect 的问题

阅读更多

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.
分享到:
评论
1 楼 fjjiaboming 2011-07-25  
那就稍微翻译一下 啊....

相关推荐

    mysql-connector-java-5.1.6.jar

    8. **异常处理**:当数据库操作遇到问题时,MySQL Connector/J会抛出相应的`SQLException`,提供错误信息以便调试。 9. **兼容性**:MySQL Connector/J 5.1.6适用于Java SE 5及更高版本,同时也支持EJB和JSP应用。 ...

    jira使用MySql数据库

    autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF8" validationQuery="Select 1" maxActive="20" /&gt; ``` 五、修改entityengine.xml文件 修改jira安装目录下的WEB-INF/classes/entityengine.xml...

    Mysql JDBC Url参数说明

    了解这些参数可以帮助开发者更好地定制与MySQL数据库的连接,优化性能,解决兼容性和安全问题。实际应用中,开发者应根据项目需求选择合适的参数组合。在阅读提供的`Mysql JDBC URL连接参数表.doc`文档后,可以获取...

    mysql-connector-java-5.1.46.zip

    7. **配置参数**:MySQL Connector/J有许多可配置的属性,如`useSSL`、`autoReconnect`、`useServerPrepStmts`等,它们可以调整驱动的行为以满足不同应用场景的需求。 8. **兼容性**:此版本5.1.46支持MySQL 5.x...

    nacos插件-mysql-connector-java-8.0.19.zip

    版本8.0.19是该连接器的一个稳定版本,优化了性能并修复了一些已知问题。 在Nacos中,MySQL Connector/J的作用主要体现在以下几个方面: 1. 数据源管理:Nacos提供了一种灵活的数据源管理方式,用户可以通过配置...

    Ofbiz10.04改用mysql数据库配置

    请注意,有时候可能需要根据 MySQL 版本和特定环境调整配置参数,例如 `time-between-eviction-runs-millis`,某些情况下可能需要将其设置为 `-1` 来避免潜在问题。务必查阅官方文档或社区论坛获取更多帮助。 总之...

    mysql-connector-java

    MySQL Connector/J有不同的版本,如5.1.7,与特定的MySQL服务器版本可能存在兼容性问题。在选择驱动版本时,应确保与使用的MySQL服务器版本相匹配。 6. 注意事项: - 安全性:避免在代码中硬编码数据库凭证,最好...

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

    3. 使用 Connector/J 连接属性 'autoReconnect=true',避免连接超时的问题。 结论 MySQL 连接超时问题是常见的错误之一,解决该问题需要了解 wait_timeout 参数的重要性,并正确地使用 show variables 命令。同时...

    mysql-connector-java-5.1.5

    6. **配置参数**:MySQL Connector/J支持多种配置参数,如`useUnicode=true`、`characterEncoding=utf8`用于设置字符编码,`autoReconnect=true`用于确保断线后自动重连等。 7. **兼容性与版本**:5.1.5版本的MySQL...

    Mysql5.1驱动

    如果从更早的MySQL版本升级,需要注意数据迁移和兼容性问题,使用`mysqldump`工具备份数据。 15. **监控与性能分析**: 可以通过`SHOW STATUS`和`SHOW VARIABLES`命令检查MySQL的状态和配置,使用`EXPLAIN`关键字...

    mysql-connector-java-5.1.38.rar

    7. **配置选项**:MySQL Connector/J支持多种连接参数,如`useSSL`(是否使用SSL加密连接)、`characterEncoding`(字符编码)、`autoReconnect`(自动重连)等,以满足不同应用场景的需求。 8. **兼容性**:5.1.x...

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

    4. 考虑使用 Connector/J 连接属性:在使用 Hibernate 进行数据库操作时,可以考虑使用 Connector/J 连接属性,例如 autoReconnect=true,来避免连接超时问题。 5. 及时释放连接:在使用完毕连接后,需要及时释放...

    nacos-server-1.3.2在Windows上运行并持久化到Mysql配置.rar

    characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true`:设置MySQL的URL,替换为你的数据库地址、端口、数据库名。 - `db.user=nacos`:设置MySQL用户名。 - `db.password=nacos`:...

    关于tomcat和mysql连接池问题的详解.docx

    在本文中,我们将深入探讨关于Tomcat和MySQL连接池问题的详解,特别关注Tomcat 5.5版本中的常见问题和解决方案。连接池是管理数据库连接的关键组件,它提高了性能并减少了资源消耗。 问题一:Cannot create JDBC ...

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

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

    mysql-connector-java-5.1.46-bin.jar

    - 版本更新:每个新版本通常会修复已知的安全问题和性能瓶颈,所以保持驱动程序的更新很重要。 - 预编译SQL(PreparedStatement):使用PreparedStatement能防止SQL注入攻击,并且由于预编译过程,执行效率通常...

    MySQL wait_timeout连接超时

    3. **使用`autoReconnect=true`属性**:如果你的应用使用的是MySQL的JDBC驱动,可以在连接字符串中添加`autoReconnect=true`属性。这将使驱动在检测到连接断开后尝试重新建立连接。然而,这种方法并非总是可靠,因为...

Global site tag (gtag.js) - Google Analytics