#connection-pooling #tomcat8 #ojdbc
Вопрос:
Я работаю над войной, запущенной на Tomcat 8.5.40, скомпилированной с jdk 8.261, и мне нужно подключиться к Oracle с драйвером ojdb8-19.3.0.0. Будет больше войн, подключающихся к одной и той же базе данных.
AFAIK и найдено в документации, есть два основных способа реализации соединений:
- Контекст/Ресурс/JNDI (https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html)
- Обычная Старая Ява (http://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html#Plain_Ol’_Java) (предпочтительно по наследственным причинам)
Поскольку я обеспокоен производительностью соединений, я буду использовать пул соединений. Мой вопрос таков:
Являются ли оба подхода одинаковыми с точки зрения производительности?
Мне просто интересно, если использовать контексты, tomcat лучше управляет пулом, особенно когда его используют несколько войн.
Ответ №1:
Есть несколько недостатков в настройке источников данных в коде вместо JNDI:
- Вы вводите зависимость своего кода от
tomcat-jdbc
конкретной версии этой библиотеки и от нее. Это означает, что ваше приложение будет работать только на определенных версиях Tomcat. - Вы теряете преимущества объединения пулов соединений между приложениями: если вы создадите источники данных программно, каждое приложение будет иметь свой собственный пул соединений. С другой стороны, с помощью JNDI вы можете решить, создавать ли один источник данных для каждого приложения или совместно использовать глобальный (см. Контекст в сравнении с глобальными именными ресурсами).
Если вы используете глобальный источник данных, то незанятые соединения вашего пула доступны для всех приложений, поэтому необходимость открывать новые соединения TCP/IP с базой данных возникает реже (затраты времени на установление нового соединения TCP/IP составляют порядка миллисекунд, поэтому относительно высоки).
Пример GlobalNamingResources
Настройка источника данных в server.xml
:
<GlobalNamingResources>
<Resource auth="Container"
type="javax.sql.DataSource"
name="jdbc/globalDb"
username="username"
password="secret"
url="jdbc:..." />
...
</GlobalNamingResources>
Добавьте a <ResourceLink>
в свой контекстный файл:
<Context>
<ResourceLink name="jdbc/db"
global="jdbc/globalDb"
type="javax.sql.DataSource" />
...
</Context>
Комментарии:
1. Не могли бы вы, пожалуйста, связать источник документации для вашего второго заявления? Звучит интересно
2. Я расширил ответ примером.