我的情况是我有一个用java创建的应用程序[现在]只连接一次到MySQL服务器并保持连接。它随机向MySQL发送查询,并且可以在不向其发送单个查询的情况下保持数小时,然后当它再次尝试发送时,JDBC说:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功收到的最后一个数据包是60314秒前。最后一个成功发送到服务器的数据包是60314秒前,这比服务器配置的值' WAIT_TIMEOUT”。您应该考虑在应用程序中使用之前过期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用Connector / J连接属性“autoReconnect = true”来避免此问题。
然后我有许多解决方案: - 每次应用程序执行查询时连接/断开连接[但它也可以在一秒钟内进行多次查询] - 将autoReconnect属性设置为“true”,并在超时时重新连接。 Personaly我喜欢第二个。但是,当我的问题突然出现时:是否建议进行短连接?还是真的没关系?为什么MySQL Server会保留wait_timeout属性?
答案 0 :(得分:1)
最好将连接处理留给连接池。看看http://sourceforge.net/projects/c3p0/
答案 1 :(得分:1)
连接池可能是一个答案,但这取决于您的应用程序。
如果该逻辑会话的长度合理限制,我宁愿将连接范围限定为逻辑会话,例如Web请求或电子邮件消息。
在新的“逻辑会话”开始时打开一个新连接,使用它,然后丢弃它很好,因为它可以最大限度地减少“坏”或“损坏”连接对其他会话的可能影响。
但是,在大多数情况下,您不希望在每个单独的操作上续订连接。对于某些情况,这可能是一种有效的策略。
连接池通常不能正确地重置使用之间的连接(在mysql中执行此操作的唯一正确方法是发送com_change_user数据包;很少有API支持这一点,更少的应用程序知道它),因此状态泄漏来自以前的用户,可能导致不可重现的错误。