java - 在 Tomcat 8 应用程序中使用多个连接池时出现命名错误

标签 java tomcat connection-pooling jdbc-pool

我有一个使用内置 Tomcat 连接池的应用程序,并且在大多数情况下它都能正常工作。当我尝试使用另一个池从同一数据库获取一组不同的连接,但使用不同的用户名/密码(这是一个 oracle 数据库,它使用 2 个用户名来访问表和函数的不同 namespace )时,就会出现问题。

第一个池被接受,但对于第二个池,我收到这个错误

15:09:47.157 [http-nio-8081-exec-5] ERROR com.applicationname.providers.ConnectionManager - NamingException in MyDataSource
javax.naming.NameNotFoundException: Name [appdb_two] is not bound in this Context. Unable to find [appdb_two].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:818) ~[catalina.jar:8.0.15]

这是我的配置:

server.xml

<GlobalNamingResources>
    <!-- Editable user database that can also be used by
    UserDatabaseRealm to authenticate users-->

    <Resource name="UserDatabase" 
              auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />

    <Resource name="jdbc/appdb_two"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.driver.OracleDriver"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

    <Resource name="jdbc/appdb_one"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.driver.OracleDriver"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

</GlobalNamingResources>

context.xml

<ResourceLink name="jdbc/appdb_two" 
              auth="Container"             
              username="DBONE"
              password="xxxx" 
              type="javax.sql.DataSource" 
              url="jdbc:oracle:thin:@xx.xxx.xxx.xxx:1521:XE"
              initialSize="20"
              maxActive="50"
              maxIdle="20"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>

<ResourceLink name="jdbc/appdb_one" 
              auth="Container"
              username="DBTWO"
              password="xxxx" 
              type="javax.sql.DataSource" 
              url="jdbc:oracle:thin:@xx.xxx.xxx.xxx:1521:XE"
              initialSize="20"
              maxActive="50"
              maxIdle="20"
              factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>
...

最佳答案

我认为您正在通过名称 "appdb_two" 查找第二个数据源, 但应该使用 "jdbc/appdb_two" - 很难单独从堆栈跟踪中看出,查找代码会有所帮助。

同时检查您的 web.xml引用了两个数据源(<resource-ref> 元素)。

关于java - 在 Tomcat 8 应用程序中使用多个连接池时出现命名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346922/

相关文章:

java - Java 中的 Jackson JSON 序列化 - 将 k/v 对写入根而不是嵌套在属性名称中

java - 使用 Eclipse 在 Apache Tomcat 中出现错误 404

apache - 将 HTTP 重定向到 HTTPS :PORT in Tomcat

mysql - 在 Openshift 上设置 GlassFish-Mysql 连接池

node.js - 我应该在哪里使用 done()

java - 处理 TabLayout 的多种场景

java - 如何在 Java 中向 Pair Hashmap 添加预定义值

asp.net - 连接字符串中ADO.Net支持的连接池的最大和最小大小是多少?

java - 如何为 CompletableFuture::supplyAsync 选择执行器

java - Tomcat 推荐人锁定