Java 11迁移-PoolDataSourceImpl的createConnectionBuilder()与javax.sql.DataSource的createConnectionBuilder()发生冲突

问题描述 投票:1回答:2

我正在尝试使用ojdbc将项目从Java 8迁移到Java 11。我正在使用一个扩展PoolDataSourceImpl的类,该类实现了PooLDataSource,它扩展了javax.sql.DataSource,并且在尝试使用maven生成它时会出现此错误:

编译失败[错误] oracle.ucp.jdbc.PoolDataSourceImpl中的createConnectionBuilder()无法实现创建javax.sql.DataSource中的ConnectionBuilder()[错误]返回类型oracle.ucp.jdbc.UCPConnectionBuilder与java.sql.ConnectionBuilder不兼容

有人有什么建议吗?

java oracle maven ojdbc ucp
2个回答
0
投票

首先,给您带来的不便,敬请原谅。问题源于以下事实:ucp.jar是使用Java 8构建/编译的,并且createConnectionBuilder()返回的oracle.ucp.jdbc.UCPConnectionBuilder不会扩展OracleConnectionBuilder,而Java 9+中的java.sql.DataSource.createConnectionBuilder返回java。 sql.ConnectionBuilder。这不是借口,但您不应扩展供应商特定的类(对于所有软件供应商而言都是如此),除非我们明确建议这样做。我们正在研究使用较新的JDK重新编译ucp,并可能为了兼容而保留JDK8版本。同时,请对JDK11使用ucp.jar和ojdbc8.jar(而不是ojdbc10.jar)。然后final UCPConnectionBuilder cb = pds.createConnectionBuilder()将起作用。


0
投票

这是界面不兼容。 javax.sql.DataSource定义了method

default ConnectionBuilder createConnectionBuilder() throws SQLException

并且根据合同,返回值必须为ConnectionBuilder类型。

如果您查看oracle.ucp.jdbc.PoolDataSourceImpl的文档,它将方法定义为

public UCPConnectionBuilder createConnectionBuilder()

oracle.ucp.jdbc.UCPConnectionBuilder不是java.sql.ConnectionBuilder的子类型。

现在,除非Oracle发布扩展了oracle.ucp.jdbc.UCPConnectionBuilder的永不版本的java.sql.ConnectionBuilder接口,否则您将无法与javax.sql.DataSource交换UCP PoolDataSource。

此时最新版本似乎是UCP 19.3,它仍然会遇到相同的问题,这很不幸,因为19.3被宣传为符合JDK11。请针对Oracle UCP提出一个错误,以使维护人员知道DataSource界面中新进入的createConnectionBuilder。

本质上,如果可行,您可能会退一步使用UCP的11g版本2(而不是12,不是19),该版本在PoolDataSource接口上没有createConnectionBuilder方法。这不是理想的情况,因为您放弃了10g的UCP改进,只需回到11g。

© www.soinside.com 2019 - 2024. All rights reserved.