【问题标题】:Intermittent error message with JSP<->Mysql connectionJSP<->Mysql 连接的间歇性错误消息
【发布时间】: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


    【解决方案1】:

    我能够通过将以下属性添加到context.xml 来解决此问题:

    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    

    这些设置会导致在从池中拉出连接时对其进行测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2014-12-20
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多