Сервлеты

Тема в разделе "Java", создана пользователем Cadet, 31 окт 2010.

  1. Cadet

    Cadet Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    реализации javax.sql.DataSource обычно потокобезопастны.
    и если удостоверится, что используемая вами реализацию потокабезопастна, то экземпляр DataSource можно шарить между сервлетами.
    а можно и не шарить, дело вкуса=) операцию получения объекта по jndi можно считать дешевой.

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



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

    Cadet Гость

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

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    ты делаешь очень грубую ошибку. Запросы к сервлету выполняют в отдельный потоках, и получается, что шаришь коннекцию между запросами и, соответственно, между потоками.

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

Поделиться этой страницей