当<Resource>context.xml中有多个元素并且<resource-ref>web.xml中有多个元素时,我的应用程序开始抛出
<Resource>
<resource-ref>
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应用程序一起正常工作。那么诀窍是什么?
jdbc:oracle:thin:@myhost:1521:orcl
appropriate service handler found
以下是当前配置的详细信息:
在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侦听器不接受/理解该连接。
no appropriate service handler found
这是我插入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连接字符串导致的。根据《 Oracle 11.1 JDBC开发人员指南和参考》的第8章“ 数据源和URL ”,连接字符串格式如下:
ORA-12519, TNS:no appropriate service handler found
jdbc:oracle:thin:@//host_name:port_number/service_name
还有一条注释说: “启动Oracle Database 10g,不支持Oracle Service ID”。 因此,您使用的语法必须适合于Oracle 9i。它可能适用于较新的版本,但不能保证。
因此,请考虑更改JDBC连接字符串的格式以遵循指南中建议的格式。
另外,对于Oracle 9i及更高版本,您应该使用oracle.jdbc.OracleDriver而不是oracle.jdbc.driver.OracleDriverOracle已声明oracle.jdbc.driver.OracleDriver不赞成使用的方式,并且将停止对此驱动程序类的支持。
oracle.jdbc.OracleDriver
oracle.jdbc.driver.OracleDriver