mysql托管DB,jdbc一段时间后应用程序冻结了

时间:2015-12-14 11:14:45

标签: java mysql jdbc innodb

我运行java程序并尝试将其与托管数据库一起使用,我自己使用Mysql运行Vserver ubuntu 12.04,完全root访问。

我更改了my.cnf以获得更多资源。 当我启动应用程序时,它很快,对本地数据库几乎没有任何区别。

我的问题是,在一段时间不活动后,程序冻结可能是因为连接断开了。 任何错误日志中都没有条目。如果我杀了应用程序并重新启动它,它再次正常工作,除了kill工作之外别无其他,它是一个linuxPC。

我使用?autoReconnect=true,但我不确定这是不正确的,这些表是innodb。

有没有人知道如何避免断开连接或如何确保重新连接?

PS [17.12.2015] 已删除?autoReconnect=true

今天我在漫长的等待后得到了一些细节

com.openbravo.basic.BasicException: 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet successfully received from the server was 2.435.471 milliseconds ago.  The last packet sent successfully to the server was 959.832 milliseconds ago.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 
Communications link failure

The last packet successfully received from the server was 2.435.471 milliseconds ago.  The last packet sent successfully to the server was 959.832 milliseconds ago.

java.net.SocketException: 

wait_timeout太短时会发生什么? 在“错误”之后,程序再次运行!

2 个答案:

答案 0 :(得分:1)

您的问题缺乏具体信息,但我想会发生什么。 MySQL服务器有一个名为wait_timeout的参数(参见official doc )。

当你的connection超过超时时,MySQL会关闭它,如果你没有正确管理SQLExceptions,你的应用程序就会出现问题。

您可以尝试增加wait_timeout或查看连接代码以管理例外,但两者都是解决方法。

我不建议你继续autoReconnect作为任何问题的替代,而不是将连接管理封装到业务逻辑中以便管理开放/每次需要时关闭连接。也许连接池可以帮助你。

我的意思是,当你从你的UI调用业务方法时(它不介意它是web,ws,桌面还是其他什么)你必须管理开放连接并启动事务,(和其他交叉问题,如授权,审计,日志,...... )。在所有业务逻辑期间,控制可能的异常,提交或回滚以及释放资源。

如果您发布一些代码,您将获得更具体的答案。

希望它有所帮助!

答案 1 :(得分:1)

autoReconnect对InnoDB很危险。当在事务中间丢失连接时,将回滚事务中的先前操作。但代码继续运行,就好像事务继续进行一样。这可能导致后续写入与回滚数据不一致。

您最好能够识别丢失的连接并重新启动交易。