oracle - 具有多个数据源的 Tomcat 6/7 JNDI

标签 oracle jakarta-ee tomcat ejb jndi

当有多个<Resource>时context.xml 中的元素和多个 <resource-ref> web.xml 中的元素,我的应用程序开始抛出

TNS:no appropriate service handler found

ORA-01017: invalid username/password; logon denied

但是,如果 JNDI 中只有一个数据源,即另一个使用常规 JDBC 数据源,则应用程序运行起来非常顺利

两个数据源都来自相同的数据库 URL,但使用不同的架构。

我的猜测是,这可能是由具有不同用户名/密码(架构)的每个资源的相同数据库 URL 引起的。但是 tomcat 应该能够处理这种情况,所以我的推理是我可能错过了一些配置?

另一个有趣的发现是: 当我使用 jdbc url jdbc:oracle:thin:@myhost:1521:orcl使用 SQL Developer 建立连接,有时连接没有问题,但有时会因同样的问题而被拒绝:appropriate service handler found而此 Web 应用程序同时处于事件状态。但是,相同的 JDBC URL 可以与另一个具有常规 JDBC 连接(不是 JNDI)的 Spring 应用程序一起正常工作。那么有什么诀窍呢?

这里是当前配置的详细信息:

在 Context.xml 中

<Resource name="jdbc/app_A" auth="Container" type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@myhost:1521:orcl"
    username="usernameA" password="passwordA" maxActive="20" maxIdle="10" maxWait="-1" />
<Resource name="jdbc/app_B" auth="Container" type="javax.sql.DataSource"
    driverClassName="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@myhost:1521:orcl"
    username="usernameB" password="usernameB" maxActive="20" maxIdle="10" maxWait="-1" />

在应用程序的 Web.xml 中:

<resource-ref>
    <description>Oracle Datasource for app_A</description>
    <res-ref-name>jdbc/app_A</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
    <description>Oracle Datasource for app_B</description>
    <res-ref-name>jdbc/app_B</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

在ApplicationContext.xml中

<jee:jndi-lookup id="dataSource1" jndi-name="java:comp/env/jdbc/app_A" resource-ref="true" />
<jee:jndi-lookup id="dataSource2" jndi-name="java:comp/env/jdbc/app_B" resource-ref="true" />

最后我得到像这样堆积的异常:

Jan 31, 2013 3:36:55 PM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: ORA-01017: invalid username/password; logon denied

Jan 31, 2013 3:36:56 PM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:278)
at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182)
at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:631)
at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:485)
at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116)
at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:539)
at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:237)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1061)
at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:671)
at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:270)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

at oracle.net.ns.NSProtocol.connect(NSProtocol.java:385)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
... 38 more
Jan 31, 2013 3:36:56 PM org.apache.catalina.core.NamingContextListener addResource
WARNING: Failed to register in JMX: javax.naming.NamingException: Listener refused the  connection with the following error:
ORA-12519, TNS:no appropriate service handler found

Jan 31, 2013 3:36:56 PM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found

真的不确定为什么 no appropriate service handler found弹出错误,似乎 orcl Listener 不接受/理解连接。

这是我插入到 persisntence.xml 中的内容

<persistence-unit name="persistenceUnit1">
....
<jta-data-source>jdbc/app_A</jta-data-source>
....
</persistence-unit>

<persistence-unit name="persistenceUnit2">
....
<jta-data-source>jdbc/app_B</jta-data-source>
....
</persistence-unit>

最佳答案

ORA-12519, TNS:no appropriate service handler found 错误可能是使用旧式 JDBC 连接字符串的结果。根据第 8 章 Data Sources and URLs Oracle 11.1 JDBC 开发人员指南和引用,连接字符串格式如下:

jdbc:oracle:thin:@//host_name:port_number/service_name

还有一条注释说“启动 Oracle 数据库 10g,不支持 Oracle 服务 ID”。所以您使用的语法一定适用于 Oracle 9i。它可能适用于较新的版本,但不能保证。

因此请考虑更改 JDBC 连接字符串的格式以遵循指南中建议的格式。

此外,从 Oracle 9i 开始,您应该使用 oracle.jdbc.OracleDriver 而不是 oracle.jdbc.driver.OracleDriver,因为 Oracle 已经声明 oracle. jdbc.driver.OracleDriver 已弃用,将停止支持此驱动程序类。

关于oracle - 具有多个数据源的 Tomcat 6/7 JNDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14655825/

相关文章:

java - 如何在没有 Maven 的情况下使用 Arquillian?

java - java中按值传递和按引用传递的混淆

java - 从 getResource 解析 webapp 的根目录

tomcat - favicon.ico 用于使用 Tomcat 的类似 REST 的 Web 服务

Tomcat 打开了太多的 jar 文件?任何修复

oracle - 对 PUBLIC 数据库链接表的托管 ODP.NET 调用导致 TNS 错误

java - 从 QueryChangeDescription 获取 RowId

sql - SQL 数据库是否有等效的 "Code Coverage"?

oracle - 如何在oracle中创建具有许多物化 View 的包

jakarta-ee - Maven 3 :How to copy a file to test directory , 当文件不存在时