我有一个 java 程序在正常工作几个小时后给我一个错误......
IOException:没有可用的缓冲区空间(达到最大连接数?)
JDBC 代码可能没有正确关闭获取连接的finally
块中try
的连接。这样,连接将保持打开状态,直到数据库强制超时并关闭它们。超时取决于使用的数据库配置。显然,以前的机器超时时间比较短,而新机器的超时时间比较长。当数据库因为您的应用程序从不关闭它们而耗尽可用连接时,您将收到类似的异常。
以下代码示例说明了用于资源处理的普通(基本)JDBC 习惯用法(注意代码流和代码注释):
public List<Entity> list() throws SQLException {
// Declare resources.
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Entity> entities = new ArrayList<Entity>();
try {
// Acquire resources.
connection = database.getConnection();
statement = connection.prepareStatement("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;
}