Создание и настройка пула соединений в Tomcat
Задача: есть некоторое java приложение которое необходимо развернуть на удаленном сервере. Приложение работает с PostgreSql. На хостинге уже предустановлены java 11, PostgreSql 10.3 и Tomcat 9. Приложению необходимо получить пул соединений.
Что вызвало у меня трудности: все примеры по созданию пула соединений Tomcat, которые мне удалось найти, представляли обычно следующую последовательность шагов: настройка файлов конфигурации самого Tomcat, настройка web.xml, получение DataSource через JNDI. Однако исходя из того, что Tomcat уже предустановлен у меня возникают некоторые вопросы и недопонимания:
- Предустановленный Tomcat скорее всего будет использоваться для совершенно разных приложений. Здравый смысл подсказывает, что никто мне не даст доступ к общим настройкам, от которых зависит работа совершенно левых приложений.
- При настройке connection pool на стороне Tomcat - один из обязательных атрибутов, который необходимо указать это url подключения к БД. В этом url необходимо указать имя БД к которой мы подключаемся. Т.е. получается, что любой пул соединений (отдельный объект типа DataSource) может быть связан только с одной конкретной БД?
Если я не ошибся в двух вышеперечисленных пунктах, то получается что настройка пула соединений встроенного в Tomcat имеет смысл только если мы сами устанавливаем и настраиваем Tomcat? А если Tomcat уже установлен и настроен админом сервера - то как тогда быть?
P.s. я новичок в данной теме.
Ответы (1 шт):
Конфигурация томкат-а это обязаность и задача того, кто его администрирует. Как правило разработчики этим не занимаются. Если это разделяемый хостинг, то нужно смотреть и читать их правила и услуги, которые они обязались предоставлять, в данном случае, позволяют ли они менять конфигурацию томката (вам напрямую или по вашему запросу).
Что касается того можно ли в томкате конфигурировать пулы соединений больше чем с одной БД, то ответ - можно. В конфигурации вы можете создать много ресурсов типа javax.sql.DataSource. У каждого свои параметры соединения с БД, количества активных/ждущих соединений и т.д. Каждый ресурс по сути отдельный пул и идентифицируется по JNDI имени.
С практической точки зрения, удобней пользоваться пулом, который конфигурируется в самом приложении и не требует конфигурации томката. Это удобней, так как вы вообще не зависите от того в каком контейнере запускаете свое приложение, это будет работать вообще без контейнера, например, в интеграционных тестах.
Для этого используйте реализации пула соединений, коих есть много. Из популярных hikaricp (испольуется в spring) или commons-dbcp (в прошлом довольно популярная реализация).
Использование такой библиотеки заключается в том, что вы используете реализацию javax.sql.DataSource из библиотеки, а она позволяет сконфигурировать параметры соединения (jdbc url, username, password) и параметры собственно пула. Приложение использует методы из DataSource (типа getConnection), а библиотека возвращает реализацию Connection, которая является оберткой над Connection из jdbc драйвера и которая при закрытии соединения, возвращает его в пул, а не закрывает.