我正在尝试使用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不兼容
有人有什么建议吗?
首先,给您带来的不便,敬请原谅。问题源于以下事实: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()
将起作用。
这是界面不兼容。 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。