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

标签 java oracle configuration jboss datasource

我正在 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/

相关文章:

java - 在哪里存储 Web 应用程序的配置变量?

java - 使用 Spark SQL 在 Java 中调用美元符号函数

java - 更新gui中的Jtable内容而不重新启动重绘表格的方法?

java - 使用 Mockito 不使用 Maven

mysql - Oracle DB - 无序列主键自增列

java - 如何将 uuid 添加到 log4j 以登录文件?

java - 为什么 apache hadoop 配置模块忽略 CDATA?

java - 避免使用多个 if-else 语句

linux - 如何在 Fedora 23 上使用脚本自动启动 Oracle 11g?

sql - 更新列时的 Oracle SQL 触发器