Когда уничтожить соединение с базой данных? - PullRequest
1 голос
/ 16 февраля 2011

Я работаю над проектом, запрограммированным в jsf, но без уровня персистентности, запросы - простые jdbc в bean-компонентах. При запуске приложения создается соединение jdbc, и, если пользователь существует и пишет свой правильный пароль, будет создан экземпляр компонента аутентификации. Моя проблема в том, что я не знаю точно, как разрушить соединение, когда bean-компонент аутентификации умирает, например, из-за тайм-аута. Другая моя проблема в том, как я узнаю, что приложение закрыто, если пользователь не нажмет кнопку «Выйти из системы» и просто закроет браузер.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

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

1 голос
/ 16 февраля 2011

При запуске приложения создается соединение jdbc

Это неправильный подход. Соединение должно быть открыто в том же блоке try, в котором вы создаете и выполняете оператор и собираете результаты. Соединение (и оператор, и набор результатов) должны быть закрыты в блоке finally этого блока try.

Невыполнение этого требования может привести к утечке ресурсов и неожиданному (и нежелательному) поведению приложения, когда это происходит и / или когда сервер БД решает прервать соединение, потому что оно слишком долго остается открытым для вашего приложения.

Ниже приведена основная идиома JDBC:

Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

try {
    connection = database.getConnection();
    statement = connection.prepareStatement(SOME_SQL);
    resultSet = statement.executeQuery();
    // ...
} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

Чтобы повысить производительность соединения, вы всегда можете использовать пул соединений, но не измените базовую идиому JDBC получения и закрытия ресурсов в кратчайшей области в блоке try-finally. Большинство приличных сервлетконтейнеров / серверов приложений поставляются со встроенными средствами объединения пулов. Пока неясно, какой из них вы используете, невозможно дать подходящий ответ по этому поводу.

Тем не менее, я все равно настоятельно рекомендую отсоединить постоянный слой от вашего MVC-слоя. Это сделает его лучше тестируемым, повторно используемым и обслуживаемым.

Смотри также:

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