我有一些连接到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连接池没有使用某种保持活动来避免这个问题。我认为这将是每个连接池设计的一部分。
答案 0 :(得分:1)
我能够通过向context.xml
添加以下属性来解决问题:
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
这些设置会导致连接在从池中拉出时进行测试。