Закрытие соединения с Oracle? - PullRequest
0 голосов
/ 01 июля 2011

Мы всегда слышим, что мы должны закрыть соединение, как только мы закончим с транзакцией. Мой вопрос здесь: даже если мы не закроем соединение, сборщик мусора освободит память, как только мы выйдем из метода, внутри которого мы создаем соединение. так в чем же проблема, даже если мы не закрываем соединение?

1 Ответ

2 голосов
/ 01 июля 2011

Нет, GC вам здесь не поможет, потому что речь идет не о памяти.

Соединение - это дефицитный ресурс на сервере баз данных , а не в клиенте приложения . Если вы очистите свою память, не сказав server , чтобы сделать то же самое, вы потеряете соединение, которое не может быть восстановлено. В конце концов вы закончите.

То же самое с ResultSet - это курсор.

Вы должны всегда закрывать все ресурсы SQL - Connection, Statement и ResultSet - в отдельных блоках finally, заключенных в блоки try / catch, в обратном порядке получения.

public class JdbcTemplate {

    public Object exampleSqlOperation(Connection c) throws SQLException {
        Object results = null;

        Statement st = null;
        ResultSet rs = null;

        try {
           // SQL stuff here
           // Load into results Object - data structure
        } catch (SQLException e) {
           e.printStackTrace(); // Better to log it.
        } finally {
            DatabaseUtils.close(rs);  
            DatabaseUtils.close(st);
        }

        return results;
    }
}

public class DatabaseUtils {
    public static void close(Connection c) {
        try {
            if (c != null) c.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // Same for Statement, ResultSet
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...