2013-02-01 12 views
5

Gdy istnieje więcej niż jeden <Resource> elementy context.xml i więcej niż jeden <resource-ref> elementy w web.xml, moja aplikacja zaczyna rzucaćTomcat 6/7 JNDI z wieloma datasources

TNS:no appropriate service handler found 

i

ORA-01017: invalid username/password; logon denied 

Jednakże, jeśli jest tylko jednym ze źródeł danych w JNDI, czyli drugi użycia regularnego źródła danych JDBC, aplikacja działa jak czar

Oba źródła danych pochodzą z tego samego adresu URL bazy danych, ale korzystają z innego schematu.

Domyślam się, że może to być spowodowane tym samym adresem URL bazy danych dla każdego zasobu z inną nazwą użytkownika/hasłem (schematem). Ale tomcat powinien być w stanie poradzić sobie z taką sytuacją, więc moje rozumowanie jest takie, że może brakowało jakiejś konfiguracji?

Innym ciekawym odkryciem jest: Gdy używam jdbc url jdbc:oracle:thin:@myhost:1521:orcl SQL Developer do konfiguracji połączenia, czasami łączy się bez problemu, ale czasami to zostanie odrzucona z tego samego problemu: appropriate service handler found gdy ta aplikacja internetowa jest aktywne w tym samym czas. Jednak ten sam URL JDBC działa dobrze z inną aplikacją Spring ze zwykłym połączeniem JDBC (nie JNDI). Więc jaka jest sztuczka?

Oto szczegóły bieżącej config:

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

W web.xml aplikacji:

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

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

I wreszcie mam wyjątek spiętrzone tak:

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 

Naprawdę nie wiem, dlaczego błąd no appropriate service handler found wyskakuje Wygląda na to, że połączenie nie jest akceptowana/zrozumiane przez Oracle Listener.

Oto co wstawić do 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

Działa u mnie. Mam około dziewięciu. Czy to zawsze ten sam zasób, który zawodzi? I czy to ten, który usuwasz, gdy testujesz go przy użyciu tylko jednego zasobu? Więc może coś jest nie tak z definicją zasobu? – EJP

+0

@EJP Dziękuję. Okazuje się, że jedno z danych źródłowych danych Jndi jest nieprawidłowe. Ale po ustaleniu tego, "nie znaleziono odpowiedniego programu obsługi" jest nadal wyświetlany, mimo że aplikacja wydaje się działać później. Czy mógłbyś coś na ten temat powiedzieć? Dzięki jeszcze raz. – Dreamer

Odpowiedz

3

ORA-12519, TNS:no appropriate service handler found błąd może być wynikiem przy użyciu ciąg połączenia JDBC w starym stylu. Zgodnie z rozdziałem 8 Data Sources and URLs JDBC Oracle 11.1 Podręcznik programisty i odniesienia, format ciąg połączenia jest następujący:

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

Jest też notatka mówiąc „Uruchamianie Oracle Database 10g, Oracle Service identyfikatory nie są obsługiwane”. Tak więc składnia, której używasz, musi być odpowiednia dla Oracle 9i. Może działać w nowszych wersjach, ale nie jest to gwarantowane.

Rozważ zmianę formatu ciągów połączeń JDBC zgodnie z formatem sugerowanym w przewodniku.

Ponadto, w przypadku Oracle 9i należy używać oracle.jdbc.OracleDriver zamiast oracle.jdbc.driver.OracleDriver, ponieważ Oracle oświadczyło, że oracle.jdbc.driver.OracleDriver jest przestarzałe i wsparcie dla tej klasy sterowników zostanie przerwane.