[英]Intermittent error message with JSP<->Mysql connection
我有一些連接到mysql數據庫的jsp頁面,並且間歇性地收到以下錯誤消息:
“成功從服務器接收到的最后一個數據包是36,727,995毫秒前。成功發送到服務器的最后一個數據包是36,733,072毫秒前。比服務器配置的'wait_timeout'值長。您應該考慮到期和/或測試連接有效性在您的應用程序中使用之前,請增加服務器為客戶端超時配置的值,或使用Connector / J連接屬性'autoReconnect = true'來避免此問題”
發生方式是非常隨機的,但是它往往在網站上沒有太多活動之后才發生,例如早晨的第一件事。
我在stackoverflow上發現此線程並提到了相同的錯誤: Tomcat6無法連接到MySql(驅動程序未從服務器收到任何數據包)
最后的解決方案是添加以下行:
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連接池沒有采用某種保持活動的方式來避免此問題。 我認為這將是每個連接池設計的一部分。
通過將以下屬性添加到context.xml
我能夠解決此問題:
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
這些設置會導致在從池中拔出連接時對其進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.