2013-02-01 83 views
5

當有context.xml中不止一個<Resource>元素在web.xml中不止一個<resource-ref>元素,我的應用程序開始扔Tomcat的6/7 JNDI與多個數據源

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監聽的理解。

這是我插入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> 
+1

適用於我。我大概有九個。它總是失敗的資源嗎?那麼你是否可以使用一種資源進行測試?那麼它的資源定義可能有問題嗎? – EJP

+0

@EJP謝謝。發現其中一個jndi數據源獲取密碼不正確。但是在修復之後,即使應用程序似乎在此之後工作,'找不到合適的服務處理程序'仍然顯示出來。你可以給我一個提示嗎?再次感謝。 – Dreamer

回答

3

ORA-12519, TNS:no appropriate service handler found錯誤可能是使用老式的JDBC連接字符串的結果。根據第8章的Oracle 11.1 JDBC開發人員指南和參考,連接字符串格式如下的Data Sources and URLs

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

還有一張紙條寫着:「啓動Oracle數據庫10g,Oracle服務標識,不支持」。因此,您使用的語法必須適用於Oracle 9i。它可能適用於較新的版本,但不能保證。

因此,請考慮更改JDBC連接字符串的格式,以遵循指南中建議的格式。

此外,對於Oracle 9i,您應該使用oracle.jdbc.OracleDriver而不是oracle.jdbc.driver.OracleDriver,因爲Oracle已聲明已棄用oracle.jdbc.driver.OracleDriver,並且將不再支持此驅動程序類。

相關問題