2011-01-30 45 views
0

我的情况是,我有一个用java制作的应用程序,[现在]只连接一次到MySQL服务器并保持连接。它随机发送查询到MySQL,它可以保持几个小时而不发送一个查询到它,那么当它试图再次发送,JDBC说:我应该经常断开/重新连接到MySQL服务器吗?

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收到的最后一个数据包为60314秒前。成功发送到服务器的最后一个数据包为60314秒前,这比服务器配置的值'wait_timeout'长。在应用程序中使用之前,应考虑过期和/或测试连接有效性,增加服务器配置的客户端超时值,或者使用Connector/J连接属性'autoReconnect = true'来避免此问题。

然后,我心里有许多解决方案: - 连接/断开每个应用程序做了查询,[但它也可以在第二个让许多查询] 时间 - 设置autoReconnect的属性为“真”,并重新连接当它超时。 Personaly我喜欢第二。但是当我的问题出现时:是否建议做短连接?或者它并不重要?为什么MySQL服务器保持wait_timeout属性?

+0

这是一个独立的应用程序(例如swing)还是服务器端应用程序(例如运行在tomcat上的应用程序)? – cherouvim 2011-01-30 17:19:41

+0

这是一个服务器端。谢谢你的回答,我想我会用它:) – olivarra1 2011-01-30 18:37:39

回答

1

连接池可能是一个答案,但它取决于您的应用程序。

如果该逻辑会话的长度有合理的限制,我宁愿将连接范围限定为逻辑会话,例如Web请求或电子邮件消息。

在新的“逻辑会话”开始时打开一个新的连接,使用它,然后丢弃它很好,因为它可以最大限度地减少其他会话上“坏”或“断开”连接的可能影响。

但是,在大多数情况下,您不希望更新每个单独操作的连接。尽管如此,这可能是一些有效的策略。

连接池通常不会正确地重置使用之间的连接(在mysql中这样做的唯一正确方法是发送com_change_user数据包;很少的API支持此功能,更少的应用程序知道它),因此状态会泄漏来自先前用户,可能会导致不可重复的错误。

相关问题