我有一个数据库 JNDI 连接池设置 context.xml JNDI 资源和 web.xml env-ref 以及初始上下文。它运行良好。但我需要为我的应用程序再构建两个数据库。
那么我是否还需要分别配置两个 JNDI 资源以及 env-ref 和初始上下文?或者三个数据库使用相同的环境引用?
为多个数据库构建连接池的有效方法是什么?请指教。
最佳答案
关于必须单独配置 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 (您可以查找所需的数据源一次,然后只需使用相同的实例)。
示例
下面是在我的一个项目中配置两个 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/