2013-02-01 23 views
5

Quando ci sono più di un <Resource> elementi in context.xml e più di un <resource-ref> elementi in web.xml, la mia domanda comincia a gettareTomcat 6/7 JNDI con più origini dati

TNS:no appropriate service handler found 

e

ORA-01017: invalid username/password; logon denied 

Tuttavia, se v'è solo una delle fonti di dati in JNDI, che significa l'altra fonte di dati regolare JDBC uso, l'applicazione viene eseguita come un fascino

Entrambe le origini dati provengono dallo stesso URL db ma utilizzano uno schema diverso.

La mia ipotesi è che potrebbe essere causato dallo stesso URL del database di ciascuna risorsa con nome utente/password (schema) diversi. Ma Tomcat dovrebbe essere in grado di gestire tale situazione, quindi il mio ragionamento è che forse qualche configurazione mi è sfuggita?

Un'altra scoperta interessante è: Quando uso url jdbc jdbc:oracle:thin:@myhost:1521:orcl con SQL Developer per impostare una connessione, a volte si connette senza problemi, ma a volte viene respinto con lo stesso problema: appropriate service handler found mentre questa applicazione web è attiva allo stesso tempo. Tuttavia, lo stesso URL JDBC funziona bene con un'altra applicazione Spring con connessione JDBC regolare (non JNDI). Allora, qual è il trucco?

Ecco i dettagli di configurazione corrente:

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 dell'applicazione:

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

E finalmente ho eccezione ammucchiati in questo modo:

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 

Davvero non so perché l'errore no appropriate service handler found apre, sembra che la connessione non viene accettata/compreso da ORCL Listener.

Ecco quello che inserisco in persisntence.xml errore

<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

Funziona per me. Ho circa nove anni. È sempre la stessa risorsa che fallisce? Ed è forse quello che rimuovi quando lo provi con una sola risorsa? Quindi forse c'è qualcosa di sbagliato nella sua definizione delle risorse? – EJP

+0

@EJP Grazie. Risulta uno dei jndi fonte dati ottenere password non corretta. Ma dopo averlo corretto, il "gestore di servizi appropriato non trovato" è ancora visibile anche se dopo l'applicazione sembra funzionare. Potresti dare un suggerimento su questo? Grazie ancora. – Dreamer

risposta

3

ORA-12519, TNS:no appropriate service handler found potrebbe essere il risultato di utilizzare una stringa di connessione JDBC vecchio stile. Secondo capitolo 8 Data Sources and URLs di Oracle 11.1 sviluppatori JDBC Guida e riferimento, formato stringa di connessione è la seguente:

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

C'è anche una nota dicendo "Avvio di Oracle Database 10g, Oracle ID di servizio non sono supportati". Quindi la sintassi che si sta utilizzando deve essere adatta per Oracle 9i. Potrebbe funzionare su versioni più recenti, ma non è garantito.

Considerare quindi di modificare il formato delle stringhe di connessione JDBC per seguire il formato suggerito nella guida.

Inoltre, per Oracle 9i in poi si dovrebbe usare oracle.jdbc.OracleDriver piuttosto che oracle.jdbc.driver.OracleDriver come Oracle hanno dichiarato che oracle.jdbc.driver.OracleDriver è deprecato e il supporto per questa classe di driver sarà interrotto.