当前位置: 代码迷 >> java >> java jdbc mysql连接器:如何在很长的空闲时间后解决断开连接问题
  详细解决方案

java jdbc mysql连接器:如何在很长的空闲时间后解决断开连接问题

热度:13   发布时间:2023-07-31 11:26:49.0

我正在使用red5 1.0.0rc1来创建一个在线游戏。 我正在使用jdbc mysql连接器v5.1.12连接到MySQL数据库

似乎在闲置几个小时后,我的应用程序可以继续运行查询,因为与db的连接已关闭,我必须重新启动应用程序。

我该如何解决这个问题?

幼狮

MySQL JDBC驱动程序具有自动重新连接功能,有时可以提供帮助; 请参阅“ ” 1 ,并阅读警告。

第二种选择是使用JDBC连接池。

第三种选择是执行查询以测试您的连接在每个事务开始时是否仍处于活动状态。 如果连接未处于活动状态,请将其关闭并打开新连接。 常见的查询是SELECT 1 也可以看看:


一个简单的解决方案是更改MySQL配置属性,将会话空闲超时设置为一个非常大的数字。 然而:

  • 如果您的应用程序可能在很长一段时间内处于空闲状态,这无济于事。
  • 如果您的应用程序(或某些其他应用程序)正在泄漏连接,则增加空闲超时可能意味着丢失的连接将无限期保持打开状态...这对数据库内存利用率不利。

1 - 如果链接中断(再次),请Google引用页面标题,然后编辑答案以使用新网址进行更新。

好吧,你重新打开连接。

连接池(强烈推荐,BTW,如果你运行Java EE你的容器 - Tomcat,JBoss等 - 可以通过JNDI提供javax.sql.DataSource ,可以为你处理池和更多)在交付之前验证连接通过运行一个非常简单的验证查询(如SELECT 1或其他东西)。 如果验证查询不起作用,它会抛弃连接并打开一个新连接。

增加连接或服务器超时往往会推迟不可避免的。

我的应用程序遇到了同样的问题,我已经删除了空闲时间标签

它真的很好用试试这个,我使用的是Jboss服务器,因为我在mysql-ds.xml文件中进行了以下更改。

如果您有任何疑问,请告诉我

普通的JDBC习惯用法是在尽可能短的范围内获取关闭Connection (以及StatementResultSet ),即在执行查询时,在方法的try-finally块中。 您不应该一直打开连接。 数据库将超时并迟早收回它。 在MySQL中,默认情况下是8小时后。

要提高连接性能,您应该考虑使用连接池,例如 ( )。 请注意,即使使用连接池,您仍然必须编写适当的JDBC代码:在尽可能短的范围内获取并关闭所有资源。 连接池反过来会担心实际关闭连接或只是将其释放回池以便进一步重用。

这是一个启动示例,您的方法如何从数据库中检索实体列表应如下所示:

public List<Entity> list() throws SQLException {
    // Declare resources.
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Entity> entities = new ArrayList<Entity>();

    try {
        // Acquire resources.
        connection = database.getConnection();
        statement = connection.createStatement("SELECT id, name, value FROM entity");
        resultSet = statement.executeQuery();

        // Gather data.
        while (resultSet.next()) {
            Entity entity = new Entity(); 
            entity.setId(resultSet.getLong("id"));
            entity.setName(resultSet.getString("name"));
            entity.setValue(resultSet.getInteger("value"));
            entities.add(entity);
        }
    } finally {
        // Close resources in reversed order.
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    // Return data.
    return entities;
}

也可以看看:

您可以查看类似问题。

将'?autoReconnect = true'附加到数据库的JDBC URL(不带引号)的末尾为我工作。

你有一个validationQuery定义(如选择1)? 如果没有,使用验证查询会有所帮助。

我看到了吗?autoReconnect = true对我不起作用。

我所做的只是创建一个名为:executeQuery的函数:

private ResultSet executeQuery(String sql, boolean retry) {
    ResultSet resultSet = null;
    try {
        resultSet = getConnection().createStatement().executeQuery(sql);
    } catch (Exception e) {
            // disconnection or timeout error
        if (retry && e instanceof CommunicationsException || e instanceof MySQLNonTransientConnectionException
                        || (e instanceof SQLException && e.toString().contains("Could not retrieve transation read-only status server"))) {
            // connect again        
            connect();
            // recursive, retry=false to avoid infinite loop
            return executeQuery(sql,false);
        }else{
            throw e;
        }
    }
    return resultSet;
}

我知道,我正在使用字符串来获取错误..需要做得更好..但这是一个好的开始,并且工作:-)

这几乎是所有原因造成的。

  相关解决方案