Tomcat 6/7 JNDI avec de multiples sources de données
Quand il y a plus d'un <Resource>
éléments context.xml et plus d'un <resource-ref>
éléments web.xml mon application commence à jeter
TNS:no appropriate service handler found
et
ORA-01017: invalid username/password; logon denied
Toutefois, s'il est un seul des sources de données JNDI, sens de l'autre un usage régulier de la source de données JDBC, l'application fonctionne comme un charme
Les deux sources de données proviennent de la même db URL, mais l'utilisation de schéma différent.
Ma conjecture est qu'il peut être causée par la même base de données d'URL de chaque ressources avec un autre nom d'utilisateur/mot de passe(schéma). Mais tomcat doit être capable de gérer une telle situation, si mon raisonnement est qu'il y a peut-être un peu de configuration j'ai raté?
Une autre constatation intéressante est:
Quand j'utilise l'url jdbc jdbc:oracle:thin:@myhost:1521:orcl
avec SQL Developer pour configurer une connexion, parfois, il se connecte sans problème, mais parfois il est rejeté avec le même problème: appropriate service handler found
bien que cette application web est actif en même temps. Cependant, la même URL JDBC fonctionne très bien avec un autre Ressort de l'application régulière de la connexion JDBC(pas JNDI). Alors, quelle est l'astuce?
Voici les détails de la config actuelle:
Dans 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" />
Dans Web.xml de l'application:
<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>
Dans 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" />
Et enfin j'arrive exception empilés comme ceci:
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
Vraiment pas pourquoi le no appropriate service handler found
d'erreur apparaît, il semble que la connexion n'est pas acceptée/compris par orcl) Auditeur.
Voici ce que j'ai insérer dans 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>
Je vous remercie. S'avère l'un des jndi de la source de données obtenir le mot de passe est incorrect. Mais après la fixation de la, de la "aucun service gestionnaire trouvé" est encore, même si l'application semble fonctionner par la suite. Pourriez-vous nous donner un indice sur qui? Merci encore.
OriginalL'auteur Dreamer | 2013-02-01
Vous devez vous connecter pour publier un commentaire.
ORA-12519, TNS:no appropriate service handler found
erreur peut être le résultat de l'utilisation d'une ancienne chaîne de connexion JDBC. Selon le chapitre 8 Sources de données et des Url de Oracle 11.1 JDBC Guide du Développeur et de Référence, la chaîne de connexion est le format suivant:Il y a aussi une note disant "Démarrage de la Base de données Oracle 10g, Oracle, IDs de Service ne sont pas pris en charge". Donc la syntaxe que vous utilisez doit avoir été adapté pour Oracle 9i. Il peut fonctionner sur des versions plus récentes, mais ce n'est pas garanti.
Donc envisager de changer le format de votre connexion JDBC chaînes de suivre le format suggéré dans le guide.
Aussi, pour Oracle 9i, vous devez utiliser
oracle.jdbc.OracleDriver
plutôt queoracle.jdbc.driver.OracleDriver
d'Oracle ont déclaré queoracle.jdbc.driver.OracleDriver
est obsolète et de soutien pour cette classe pilote sera interrompu.OriginalL'auteur maksim_khokhlov