我运行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
太短时会发生什么?
在“错误”之后,程序再次运行!
答案 0 :(得分:1)
您的问题缺乏具体信息,但我想会发生什么。 MySQL服务器有一个名为wait_timeout
的参数(参见official doc )。
当你的connection
超过超时时,MySQL会关闭它,如果你没有正确管理SQLExceptions,你的应用程序就会出现问题。
您可以尝试增加wait_timeout
或查看连接代码以管理例外,但两者都是解决方法。
我不建议你继续autoReconnect
作为任何问题的替代,而不是将连接管理封装到业务逻辑中以便管理开放/每次需要时关闭连接。也许连接池可以帮助你。
我的意思是,当你从你的UI调用业务方法时(它不介意它是web,ws,桌面还是其他什么)你必须管理开放连接并启动事务,(和其他交叉问题,如授权,审计,日志,...... )。在所有业务逻辑期间,控制可能的异常,提交或回滚以及释放资源。
如果您发布一些代码,您将获得更具体的答案。
希望它有所帮助!
答案 1 :(得分:1)
autoReconnect对InnoDB很危险。当在事务中间丢失连接时,将回滚事务中的先前操作。但代码继续运行,就好像事务继续进行一样。这可能导致后续写入与回滚数据不一致。
您最好能够识别丢失的连接并重新启动交易。