java - 如何为多个数据库配置JNDI连接池?

标签 java jdbc jndi connection-pooling deployment-descriptor

我有一个数据库 JNDI 连接池设置 context.xml JNDI 资源和 web.xml env-ref 以及初始上下文。它运行良好。但我需要为我的应用程序再构建两个数据库。

那么我是否还需要分别配置两个 JNDI 资源以及 env-ref 和初始上下文?或者三个数据库使用相同的环境引用?

为多个数据库构建连接池的有效方法是什么?请指教。

最佳答案

关于必须单独配置 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-refmessage-destination-refenv-refresource-env-部署描述符中的 ref 元素。

因此,您必须分别查找每个 DataSource来自InitialContext (您可以查找所需的数据源一次,然后只需使用相同的实例)。


示例

下面是在我的一个项目中配置两个 MySQL 数据库的示例。使用 The Tomcat JDBC Connection Pool 配置一个数据库,另一个没有连接池(您可以按照自己喜欢/需要的方式进行操作)。

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>

补充阅读

关于java - 如何为多个数据库配置JNDI连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20033596/

相关文章:

java - 依赖版本更改后 mvn 依赖无法识别

java - 异常 java.lang.NoClassDefFoundError : com. google.android.gms.common.AccountPicker

java - Neo4j jdbc 驱动程序中的数据库连接池

java - 静态字段 PI_ENABLE_OUTPUT_ESCAPING 和 PI_DISABLE_OUTPUT_ESCAPING 有何用途以及如何使用它们?

java - 是否可以通过 Firebase 托管托管 Java Spring 应用程序?

Java 8/JBoss 7 - 无法获取 bean 实例

java - 在这个 JMS 示例中,JNDI 查找是如何工作的?

javax.命名.NameNotFoundException : Name ejb/com not found in context "java:comp/env"

java - 什么时候应该在 ActiveMQ 中使用 JDBC 持久性适配器?

java - JPA 和服务器时区错误