数時間正常に動作した後にエラーが発生するJavaプログラムがあります...
IOException: 利用可能なバッファ領域がありません (最大接続数に達しましたか?)
JDBC コードは、接続が取得されたfinally
ブロック内の接続を適切に閉じていない可能性があります。try
このようにして、DB が強制的にタイムアウトして接続を閉じるまで、接続は開いたままになります。タイムアウトは、使用される DB 構成によって異なります。どうやら、タイムアウトは以前のマシンでは比較的短く、新しいマシンでは比較的長かったようです。アプリケーションがそれらを閉じないためにDBが利用可能な接続を使い果たすと、そのような例外が発生します。
次のコード例は、リソース処理のための通常の (基本的な) 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;
}