Как настроить пул соединений JNDI для нескольких баз данных?
У меня есть одна база данных JNDI-подключения пула установки context.xml ресурсов JNDI и web.xml env-ref и начального контекста. Это работает хорошо. Но мне нужно построить еще две базы данных для моего приложения.
Так нужно ли мне настраивать еще два ресурса JNDI и env-ref и начальный контекст отдельно? Или это же env-ref для трех баз данных?
Как эффективно создать пул соединений для нескольких баз данных? Пожалуйста, порекомендуйте.
1 ответ
Вы совершенно правы в том, что вам нужно настраивать ресурсы JNDI отдельно. Единственное, что в web.xml НЕТ <env-ref>
элемент, но <resource-env-ref>
а также <resource-ref>
элементы.
Чтобы использовать больше баз данных, необходимо выполнить следующие дополнительные настройки для каждого ресурса:
- добавить новый
<Resource>
в файле context.xml - добавить новый
<resource-ref>
или же<resource-env-ref>
в файле web.xml
НОТА:
Если вы используете @Resource
аннотации, новый ресурс больше не нужно определять в дескрипторе развертывания (web.xml). Эта аннотация эквивалентна объявлению элемента resource-ref, message-destination-ref или env-ref или resource-env-ref в дескрипторе развертывания.
И, соответственно, вы должны отдельно искать каждый DataSource из InitialContext (вы можете найти нужный DataSource один раз, а затем просто использовать один и тот же экземпляр).
пример
Ниже приведен пример настройки двух баз данных MySQL из одного из моих проектов. Одна база данных сконфигурирована с использованием пула соединений Tomcat JDBC, другая без пула соединений (вы можете делать это по своему усмотрению / необходимости).
context.xml (находится в каталоге /META-INF):
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- Configuration for primary DB -->
<Resource name="jdbc/TestShopDB"
type="javax.sql.DataSource"
auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test_shop"
username="root"
password="mysql"
maxActive="100"
minIdle="10"
initialSize="10"
validatonQuery="SELECT 1"
validationInterval="30000"
removeAbandoned="true"
removeAbandonedTimeout="60"
abandonWhenPercentageFull="50"
closeMethod="close"/>
<!-- Configuration for administration DB -->
<Resource name="jdbc/TestShopAdminDB"
type="javax.sql.DataSource"
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test_shop_admin"
username="root"
password="mysql"/>
</Context>
web.xml (находится в каталоге /WEB-INF; несущественные части для краткости опущены):
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
...
<!-- Configuration for primary DB -->
<resource-ref>
<res-ref-name>jdbc/TestShopDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- Configuration for administration DB -->
<resource-ref>
<res-ref-name>jdbc/TestShopAdminDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
...
</web-app>