Oracle   发布时间:2022-05-17  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了oracle – 具有多个数据源的Tomcat 6/7 JNDI大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
当有多个<资源> context.xml中的元素和多个< resource-ref> web.xml中的元素,我的应用程序开始抛出
TNS:no appropriate service handler found

ORA-01017: invalID username/password; logon denIEd

但是,如果JNDI中只有一个数据源,意味着另一个使用常规JDBC数据源,则应用程序就像魅力一样运行

两个数据源都来自相同的db URL,但使用不同的模式.

我的猜测是,它可能是由具有不同用户名/密码(架构)的每个资源的相同数据库URL引起的.但是tomcat应该能够处理这种情况,所以我的理由是可能有一些我错过的配置?

另一个有趣的发现是:
当我使用jdbc url jdbc:oracle:thin:@myhost:1521:orcl与sql Developer建立连接时,有时它连接没有问题,但有时会被同一问题拒绝:在此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,TNS:no appropriate service handler found

真的不确定为什么没有合适的服务处理程序发现错误弹出,似乎orcl Listener不接受/理解连接.

这是我插入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>
ORA-12519,TNS:找不到合适的服务处理程序错误可能是使用旧式JDBC连接字符串的结果.根据Oracle 11.1 JDBC Developer’s GuIDe and Reference的第8章 Data Sources and URLs,连接字符串格式如下:
jdbc:oracle:thin:@//host_name:port_number/service_name

还有一条说明“启动Oracle数据库10g,不支持Oracle服务ID”.因此,您使用的语法必须适用于Oracle 9i.它可能适用于较新的版本,但不能保证.

因此,请考虑更改JDBC连接字符串的格式,以遵循指南中建议的格式.

此外,对于Oracle 9i以上,您应该使用oracle.jdbc.OracleDriver而不是oracle.jdbc.driver.OracleDriver,因为Oracle已经声明不推荐使用oracle.jdbc.driver.OracleDriver,并且将停止对此驱动程序类的支持.

大佬总结

以上是大佬教程为你收集整理的oracle – 具有多个数据源的Tomcat 6/7 JNDI全部内容,希望文章能够帮你解决oracle – 具有多个数据源的Tomcat 6/7 JNDI所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: