2013-02-01 4 views
5

Wenn es mehr als ein <Resource> Elemente in context.xml und mehr als ein <resource-ref> Elemente in web.xml, beginnt meine AnwendungTomcat 6/7 JNDI mit mehreren Datenquellen

TNS:no appropriate service handler found 

und

zu werfen
ORA-01017: invalid username/password; logon denied 

jedoch, wenn nur eine der Datenquellen in JNDI ist, die andere regelmäßige JDBC-Datenquelle verwenden bedeutet, wird die Anwendung wie ein Zauber

Beide Datenquellen stammen von derselben Datenbank-URL, verwenden jedoch ein anderes Schema.

Meine Vermutung ist, dass es durch die gleiche Datenbank-URL der einzelnen Ressourcen mit unterschiedlichen Benutzernamen/Passwort (Schema) verursacht werden kann. Aber der Kater sollte in der Lage sein, mit einer solchen Situation fertig zu werden, deshalb denke ich, dass es vielleicht eine Konfiguration gibt, die ich verpasst habe?

Ein weiteres interessantes Ergebnis ist: Wenn ich JDBC-URL jdbc:oracle:thin:@myhost:1521:orcl mit SQL Developer Setup eine Verbindung verwenden, manchmal ist es ohne Frage verbindet, aber manchmal wird es mit dem gleichen Problem abgelehnt: appropriate service handler found während diese Web-Anwendung ist aktiv an den gleichen Zeit. Die gleiche JDBC-URL funktioniert jedoch mit einer anderen Spring-Anwendung mit regulärer JDBC-Verbindung (nicht JNDI). Also, was ist der Trick?

Hier sind die Details der aktuellen config:

In 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" /> 

In Web.xml der Anwendung:

<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> 

In 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" /> 

Und schließlich bekomme ich Ausnahme wie folgt aufgestapelt:

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 

wirklich nicht sicher, warum die no appropriate service handler found Fehlermeldung erscheint, scheint es, die Verbindung durch orcl Zuhörer nicht akzeptiert/verstanden.

Hier ist, was ich in persisntence.xml einfügen

<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

Funktioniert für mich. Ich habe ungefähr neun. Fällt immer dieselbe Ressource aus? Und ist das vielleicht die, die Sie entfernen, wenn Sie es mit nur einer Ressource testen? Vielleicht stimmt etwas mit seiner Ressourcendefinition nicht? – EJP

+0

@EJP Danke. Stellt sich heraus, eine der JNDI-Datenquelle erhalten Passwort ist falsch. Aber nachdem das behoben wurde, wird der 'no passable service handler found' immer noch angezeigt, obwohl die Anwendung danach zu funktionieren scheint. Könnten Sie bitte einen Hinweis darauf geben? Danke noch einmal. – Dreamer

Antwort

3

ORA-12519, TNS:no appropriate service handler found Fehler konnte das Ergebnis der Verwendung einer alten Stil JDBC Connection String. Gemäß Kapitel 8 Data Sources and URLs von Oracle 11.1 JDBC-Entwicklerhandbuch und Referenz, Format Verbindungszeichenfolge wird wie folgt:

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

Es gibt auch eine Notiz "Starten von Oracle Database 10g, Oracle Service-IDs werden nicht unterstützt" sagen. Die von Ihnen verwendete Syntax muss daher für Oracle 9i geeignet sein. Es könnte bei neueren Versionen funktionieren, aber das ist nicht garantiert.

Sie sollten das Format Ihrer JDBC-Verbindungszeichenfolgen entsprechend dem im Handbuch vorgeschlagenen Format ändern.

Auch für Oracle 9i sollten Sie oracle.jdbc.OracleDriver anstelle von oracle.jdbc.driver.OracleDriver verwenden, da Oracle angegeben hat, dass oracle.jdbc.driver.OracleDriver veraltet ist und die Unterstützung für diese Treiberklasse eingestellt wird.