JBoss 当 2 个不同的版本位于 2 个单独的模块中时,将不会使用来自正确模块的 Oracle DataSource 驱动程序

JBoss won't use the Oracle DataSource driver from the correct module when 2 different versions are in 2 separate modules

我运行正在 JBoss 7 (Java 1.7) 下使用 ojdbc14.jar.[=23= 连接到 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

当我在 standalone.xml 中注释掉 oracle14 驱动程序和使用它的数据源时,Oracle 12 数据源 运行 如预期的那样。

我假设这是某种类加载器问题,但模块不应该解决这个问题吗?我应该怎么做才能让两者都能毫无问题地连接?

我还没有尝试使 Oracle 10 数据源依赖于 Oracle 12 驱动程序。

删除 ojdbc14.jar。在 both/all 个模块中使用 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.