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

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

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

我该如何解决这个问题?

幼狮

MySQL JDBC驱动程序具有自动重新连接function,有时可以提供帮助; 请参阅Connector / J的驱动程序/数据源类名,URL语法和配置属性 ,并阅读警告。

根据我的经验,最好的解决方案是更改MySQL配置属性,将会话空闲超时设置为一个非常大的数字。

好吧,你重新打开连接。

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

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

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

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

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

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

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

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

 public List list() throws SQLException { // Declare resources. Connection connection = null; Statement statement = null; ResultSet resultSet = null; List entities = new ArrayList(); 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; } 

也可以看看:

  • DAO教程 – 如何编写适当的JDBC代码

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

您可以在此处查看类似问题。

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

我看到了吗?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; } 

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

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