如何在JBOSS EAP 8中正确获取oracle.jdbc.driver.OracleConnection?
在JBOSS EAP 8中正确获取OracleConnection的解决方案
针对你遇到的Connection is not an instance of oracle connection错误,可按以下步骤排查解决:
1. 替换OracleConnection的引用类型
ojdbc11中推荐使用标准接口oracle.jdbc.OracleConnection,而非具体实现类oracle.jdbc.driver.OracleConnection。JBOSS的连接包装层通常只对标准JDBC接口的实现进行包装,直接尝试unwrap到驱动内部实现类会失败。
修改代码如下:
Connection wrappedConnection = connectionHandle.getConnection(); oracle.jdbc.OracleConnection oracleConn = null; if (wrappedConnection.isWrapperFor(oracle.jdbc.OracleConnection.class)) { oracleConn = wrappedConnection.unwrap(oracle.jdbc.OracleConnection.class); } else { System.out.println("Connection is not an instance of oracle connection"); } // 后续创建STRUCT、ARRAY的逻辑保持不变 Collection<STRUCT> structs = new ArrayList<STRUCT>(); StructDescriptor desc = StructDescriptor.createDescriptor("SOME_OBJECT",oracleConn); for(SomeVO someVO : someDetails) { Object[] objArray = someVO.toInvArray(); structs.add(new STRUCT(desc,oracleConn,objArray)); } ArrayDescriptor arraydesc = ArrayDescriptor.createDescriptor("SOME_ARRAY",oracleConn); ARRAY array = new ARRAY(arraydesc,oracleConn,structs.toArray());
2. 修正Maven依赖的作用域
由于你已经通过JBOSS核心模块提供ojdbc驱动,需避免应用包中打包重复的驱动类,否则会引发类加载冲突。将依赖的scope设置为provided:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc11</artifactId> <version>23.9.0.25.07</version> <scope>provided</scope> </dependency>
3. 验证Oracle核心模块的配置
确保你在JBOSS中创建的Oracle模块配置正确:
- 模块目录结构应为
modules/com/oracle/main(对应com.oracle模块名),目录下放置ojdbc11.jar和module.xml module.xml需包含正确的依赖和资源配置,示例如下:
<?xml version="1.0" encoding="UTF-8"?> <module name="com.oracle" xmlns="urn:jboss:module:1.9"> <resources> <resource-root path="ojdbc11.jar"/> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> <module name="javax.servlet.api" optional="true"/> </dependencies> </module>
4. 确认jboss-deployment-structure.xml的依赖有效性
确保jboss-deployment-structure.xml中引用的模块名与你创建的模块名完全一致,若模块名是com.oracle.database.jdbc,则需同步修改此处的模块名。另外,可添加export="true"确保模块类对应用可见:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <dependencies> <module name="com.oracle" export="true"/> </dependencies> </deployment> </jboss-deployment-structure>
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

