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

时间:2020-02-06 15:10:50

标签: java oracle maven ojdbc ucp

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

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

有人有什么建议吗?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

问题是您尝试子类化PoolDataSourceImpl,它是使用JDK8编译的特定于供应商的类,除非我们明确建议这样做,否则我们不支持扩展类,除非在this blog中进行;所有软件供应商都是如此。 作为此限制的一部分,我们的驱动程序(ojdbc8.jar,ucp.jar)与较新的JDK版本(即,可与JDK11一起使用)和数据库版本向前兼容。

答案 2 :(得分:0)

由于这个问题,在PoolDataSource上使用基于接口的代理进行代理将永远无法工作。 同样,在oracle ucp上也记录了一个错误。我什至发布了一个论坛查询,对此https://community.oracle.com/thread/4325841没有任何答复。