• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Сервлеты

  • Автор темы Cadet
  • Дата начала
C

Cadet

Моё веб-приложение состоит из нескольких сервлетов, каждый их которых использует соединение к одной и той же базе данных. Соединение осуществляется через пул, настроенный средствами сервера (Tomcat). Создание подключения осуществляется следующими строками:
Код:
Context initContext = new InitialContext();
DataSource ds = (DataSource) initContext.lookup("java:/comp/env/newDS");
Connection db = ds.getConnection();
Вопрос такой: Нужно ли мне в коде каждого сервлета писать эти строчки, то есть создавать подключение при выполнении каждого сервлета, или нужно сделать как-то по-другому, чтобы все сервлеты использовали одно и то же где-то и как-то созданное подключение.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
реализации javax.sql.DataSource обычно потокобезопастны.
и если удостоверится, что используемая вами реализацию потокабезопастна, то экземпляр DataSource можно шарить между сервлетами.
а можно и не шарить, дело вкуса=) операцию получения объекта по jndi можно считать дешевой.

а вот Conneсtion шарить однозначно нельзя. да и не надо, раз уж вы используете пул, то приложение и так использует одни и те же коннекции, созданные пулом. тут главное не держать конекцию, больше необходимого, и не забыть отдавать обратно в пул.



Код:
Connection db = ds.getConnection();
try {
} finaly {
db.close();
}
 
C

Cadet

А если я закрою соединение не в блоке finaly{} как показано выше, а в методе destroy() сервлета:
Код:
 public void destroy() {
try {
db.close();
} catch (SQLException e) {
}
}

Как лучше и какая принципиальная разница?
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
ты делаешь очень грубую ошибку. Запросы к сервлету выполняют в отдельный потоках, и получается, что шаришь коннекцию между запросами и, соответственно, между потоками.

вся работа с конекциями должна происходить в try/finaly,(да и не только с коннекциями, а со всеми ресурсами, которые требуют явного освобождения) иначе, если между получением коннекции и освобождением произойдет и исключительная ситуация, коннекция не вернется в пул.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!