Как управлять соединениями БД на сервере? - PullRequest
1 голос
/ 05 июня 2010

У меня серьезная проблема с подключением к базе данных в моем веб-приложении. Поскольку я использую одно соединение с базой данных для всего приложения из одноэлементного класса Database, при попытке выполнить параллельные операции с БД (два пользователя) база данных откатывает транзакции. Это мой статический метод:

Все потоки / сервлеты вызывают статические методы Database.doSomething (...), которые, в свою очередь, вызывают метод ниже.

private static /* synchronized*/ Connection getConnection(final boolean autoCommit) throws SQLException {
    if (con == null) {
        con = new MyRegistrationBean().getConnection();
    }
    con.setAutoCommit(true); //TODO
    return con;
}

Каков рекомендуемый способ управления этим подключением к БД, чтобы я не столкнулся с той же проблемой.

Ответы [ 3 ]

5 голосов
/ 05 июня 2010

Держать Connection открытым навсегда - очень плохая идея. У него нет бесконечного срока службы, ваше приложение может аварийно завершить работу, когда БД отключит соединение и закроет его. Рекомендуется приобретать и close Connection, Statement и ResultSet в кратчайшем возможном объеме, чтобы избежать утечек ресурсов и потенциальных сбоев приложений, вызванных утечками и таймаутами.

Поскольку подключение БД является дорогостоящей задачей, вам следует рассмотреть возможность использования пула соединений для повышения производительности соединения. Достойный сервер приложений / сервлетконтейнер обычно уже предоставляет функцию пула соединений во вкусе JNDI DataSource. Консультируйтесь с его документацией для деталей, как создать это. В случае, например, Tomcat вы можете найти его здесь .

Даже при использовании пула соединений вы все равно должны написать правильный код JDBC: получите и закройте все ресурсы в кратчайшей возможной области. Пул соединений, в свою очередь, будет беспокоиться о том, чтобы фактически закрыть соединение или просто вернуть его обратно в пул для дальнейшего повторного использования.

Вы можете получить более подробную информацию из этой статьи о том, как правильно сделать основы JDBC. Как совершенно другая альтернатива, изучите EJB и JPA. Он будет абстрагировать весь шаблон JDBC для вас в oneliners.

Надеюсь, это поможет.

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

1 голос
/ 05 июня 2010

У меня немного опыта работы с PostgreSql, но все веб-приложения, над которыми я работал, использовали одно соединение для каждого набора действий на странице, закрывая его и удаляя его, когда закончите.

Это позволяет серверу объединять в пул соединения и останавливает проблемы, такие как та, с которой вы столкнулись.

0 голосов
/ 17 марта 2011

Синглтон должен быть самим соединением пула JNDI; Класс базы данных с getConnection (), методами запросов и др. НЕ должен быть одноэлементным, но может быть статическим, если вы предпочитаете.

Таким образом, пул существует неограниченное время, доступный для всех пользователей, в то время как блоки запросов используют dataSource.getConnection () для рисования соединения из пула; выполните запрос, а затем закройте оператор, набор результатов и соединение (чтобы вернуть его в пул).

Кроме того, поиск JNDI довольно дорог, поэтому в этом случае имеет смысл использовать синглтон.

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