【发布时间】:2011-08-28 23:32:10
【问题描述】:
我有一些连接到 mysql 数据库的 jsp 页面,我间歇性地收到以下错误消息:
“从服务器成功接收的最后一个数据包是 36,727,995 毫秒前。最后一个成功发送到服务器的数据包是 36,733,072 毫秒前。比服务器配置的“wait_timeout”值长。您应该考虑过期和/或在您的应用程序中使用之前测试连接有效性,增加客户端超时的服务器配置值,或使用 Connector/J 连接属性 'autoReconnect=true' 来避免此问题"
发生模式非常随机,但往往在网站上没有太多活动之后最频繁地发生,比如早上的第一件事。
我在 stackoverflow 上发现了这个线程,它提到了同样的错误: Tomcat6 can't connect to MySql (The driver has not received any packets from the server)
最终的解决方案是添加这一行:
permission java.net.SocketPermission "127.0.0.1:3306", "connect";
到
$TOMCAT-CONFIG/policy.d/04webapps.policy
我在 centOS 5.5 上运行 tomcat 7,但在任何地方都没有看到 policy.d 目录和 04webapps.policy 文件。我需要手动创建这两个,还是有其他方法可以解决这个问题?
更新: 这是我如何在我的一个 jsp 文件中查询数据库的示例:
DBFunctions dbf = null;
boolean bException = false;
ArrayList<String[]> arrayListRows1 = new ArrayList<String[]>();
try
{
dbf = new DBFunctions();
dbf.db_run_query(query2);
while (dbf.rs.next()) {
String [] tmp = new String[6];
tmp[0] = dbf.rs.getString("fact_data.entity_id");
tmp[1] = dbf.rs.getString("date_begin");
tmp[2] = dbf.rs.getString("value");
tmp[3] = dbf.rs.getString("ticker");
tmp[4] = dbf.rs.getString("full_name");
tmp[5] = dbf.rs.getString("name");
arrayListRows1.add(tmp);
}
}
catch (SQLException sqle)
{
out.println(PopulateSpreadsheet.createGoogleError(strReqId,"sql_exception",sqle.getMessage(),"PF ERROR CODE 2eh2-1"));
bException = true;
}
finally
{
if (dbf !=null) dbf.closeConnection();
if (bException == true)
return;
}
DBFunctions.java 位于 Web 应用程序的 src/ 目录下,因此从技术上讲,它不是直接查询数据库的 jsp 页面。
我会回去再检查一次,但我尝试以相同的方式对所有数据库查询进行编码,并在使用 ResultSet 后立即关闭连接。
关于如何最好地对连接池进行清点以定期检查连接状态的任何建议?
更新:我仍然遇到此错误的问题。我很欣赏关于将我的大部分编程逻辑从我的 jsp 页面移到 servlet/库中的建议,但我认为这不会解决这个特定问题。
其他人报告说看到了这个问题,这是因为 mysql 在 tomcat jdbc 连接池中超时连接。对我来说很奇怪,tomcat 连接池没有使用某种保持活动来避免这个问题。我认为这将成为每个连接池设计的一部分。
【问题讨论】:
标签: java mysql jsp tomcat jdbc