Должны ли JDBC Resultsets и Statement быть закрыты отдельно, хотя впоследствии было закрыто Соединение? - PullRequest
229 голосов
/ 22 декабря 2010

Говорят, что это хорошая привычка - закрывать все ресурсы JDBC после использования. Но если у меня есть следующий код, нужно ли закрывать Resultset и Statement?

Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
    conn = // Retrieve connection
    stmt = conn.prepareStatement(// Some SQL);
    rs = stmt.executeQuery();
} catch(Exception e) {
    // Error Handling
} finally {
    try { if (rs != null) rs.close(); } catch (Exception e) {};
    try { if (stmt != null) stmt.close(); } catch (Exception e) {};
    try { if (conn != null) conn.close(); } catch (Exception e) {};
}

Вопрос в том, выполняет ли закрытие соединения какую-либо работу или оставляет какие-либо ресурсы в использовании.

Ответы [ 11 ]

0 голосов
/ 05 января 2016

С формой Java 6, я думаю, лучше проверить, закрыта она или нет перед закрытием (например, если какой-либо пул соединений высвобождает соединение в другом потоке) - например, некоторая проблема сети - оператор и состояние набора результатов могут быть закрыты,(это случается не часто, но у меня была эта проблема с Oracle и DBCP).Мой шаблон для этого (в более старом синтаксисе Java):

    try {
        ...   
        return resp;
    } finally {
        if (rs != null && !rs.isClosed()) {
            try {
                rs.close();
            } catch (Exception e2) { 
                log.warn("Cannot close resultset: " + e2.getMessage());
           }
        }
        if (stmt != null && !stmt.isClosed()) {
            try {
               stmt.close();
            } catch (Exception e2) {
                log.warn("Cannot close statement " + e2.getMessage()); 
            }
        }
        if (con != null && !conn.isClosed()) {
            try {
                con.close();
            } catch (Exception e2) {
                log.warn("Cannot close connection: " + e2.getMessage());
            }
    }

Теоретически он не идеален на 100%, потому что между проверкой состояния закрытия и самим закрытием остается мало места для изменениядля гос.В худшем случае вы получите предупреждение в течение длительного времени.- но это меньше, чем возможность изменения состояния в долгосрочных запросах.Мы используем этот шаблон в производстве с нагрузкой «avarage» (150 одновременных пользователей), и у нас не было никаких проблем с ним - поэтому никогда не смотрите это предупреждающее сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...