我正在尝试将项目从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不兼容
有人有什么建议吗?
答案 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没有任何答复。