Как настроить пул соединений 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> элементы.

Чтобы использовать больше баз данных, необходимо выполнить следующие дополнительные настройки для каждого ресурса:

  1. добавить новый <Resource> в файле context.xml
  2. добавить новый <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>

Дополнительное чтение

Другие вопросы по тегам