我正在 JBoss 7 (Java 1.7) 下运行一个应用程序,该应用程序使用 ojdbc14.jar
连接到 Oracle 10.2.0.3 数据库。 .
同一应用程序还必须连接到不同的 Oracle 数据库 12.1.0.2,我有一个 ojdbc7.jar
.
每个 Oracle 驱动程序 jar 都放置在其自己的 JBoss 模块中:
D:\Jboss\jboss-7.2.0.Final\modules\com\Oracle\ojdbc7\main\ojdbc7.jar
D:\Jboss\jboss-7.2.0.Final\modules\com\Oracle\ojdbc14\main\ojdbc14.jar
假设module.xml
文件是正确的(它们是;创建 ojdbc#.jar.index
文件)。
在 standalone.xml
,我在 <drivers>
下声明了以下内容:
<driver name="oracle14" module="com.oracle.ojdbc14">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
</driver>
<driver name="oracle7" module="com.oracle.ojdbc7">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
</driver>
对于我的数据源,我执行了以下操作:
<datasource jndi-name="java:jboss/datasources/OracleTen" pool-name="OracleTen-DEV" enabled="true" use-java-context="true">
<connection-url>jdbc:oracle:thin:@ORACLE10DEV:49125:databasename</connection-url>
<driver>oracle14</driver>
...
</datasource>
<datasource jndi-name="java:jboss/datasources/OracleTwelve" pool-name="OracleTwelve-DEV" enabled="true" use-java-context="true">
<connection-url>jdbc:oracle:thin:@ORACLE12DEV:1521:databasename</connection-url>
<driver>oracle7</driver>
...
</datasource>
当尝试针对 Oracle 12 数据源运行时,它使用 Oracle 10 驱动程序,如抛出的代码所示:
Caused by: java.sql.SQLException: ORA-28040: No matching authentication protocol
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:283)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:278)
at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOsesskey(T4CTTIoauthenticate.java:294)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:357)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:254)
... 18 more
当我注释掉oracle14
时驱动程序和在 standalone.xml
中使用它的数据源,Oracle 12 数据源按预期运行。
我认为这是某种类加载器问题,但是模块不是应该解决这个问题吗?我应该怎么做才能让两者顺利连接?
我尚未尝试使 Oracle 10 数据源依赖于 Oracle 12 驱动程序。
最佳答案
删除ojdbc14.jar
。在两个/所有模块中使用ojdbc7.jar
。
12.1.0.2 驱动程序向后兼容 10.2.0.3 服务器。
this page 上的矩阵不包括 10.2,但它说:
Best Practice that we recommend is, JDBC driver version should always be either same as or higher than the Oracle database version being used in order to leverage the latest capabilities of the JDBC driver.
关于java - 当 2 个不同的版本位于 2 个单独的模块中时,JBoss 将不会使用正确模块中的 Oracle DataSource 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45113095/