我正在尝试将一个项目从Java 8迁移到使用ojdbc的Java 11。我正在使用一个扩展PoolDataSourceImpl的类,它实现了PooLDataSource,它扩展了javax.sql.DataSource,并且在尝试使用maven构建它时,它给出了此错误:
编译失败 [ERROR] createConnectionBuilder(( in oracle.ucp.jdbc.PoolDataSourceImpl 無法實現 create javax.sql.DataSource 中的 ConnectionBuilder(( [ERROR] 返回类型 oracle.ucp.jdbc.UCPConnectionBuilder 与 java.sql.ConnectionBuilder 不兼容
有人有什么建议吗?
这是接口不兼容。javax.sql.DataSource
定义方法
default ConnectionBuilder createConnectionBuilder() throws SQLException
根据协定,返回值要求类型为 ConnectionBuilder。
如果您查看oracle.ucp.jdbc.PoolDataSourceImpl的文档,它将该方法定义为
public UCPConnectionBuilder createConnectionBuilder()
而oracle.ucp.jdbc.UCPConnectionBuilder
不是java.sql.ConnectionBuilder
的亚型。
现在,除非 Oracle 发布扩展java.sql.ConnectionBuilder
的oracle.ucp.jdbc.UCPConnectionBuilder
接口的从未版本,否则您将无法将 UCP PoolDataSource 与javax.sql.DataSource
互换。
此时的最新版本似乎是UCP 19.3,它仍然会遇到同样的问题,不幸的是,因为19.3被宣传为JDK11兼容。请针对Oracle UCP提出一个错误,以使维护者了解数据源界面中的新进入者createConnectionBuilder。
在 intrim 中,如果可行,您可以回退到 UCP 的 11g 版本 2(不是 12,不是 19(,它在 PoolDataSource 接口上没有 createConnectionBuilder 方法。这不是一个理想的情况,因为您通过回到 11g 放弃了 UCP 十年的改进。
此问题在 21.3 中使用 ucp11 .jar(使用 JDK11 编译的 UCP 版本(中得到解决。在此版本中,UCPoracle.ucp.jdbc.UCPConnectionBuilder
扩展java.sql.ConnectionBuilder
。
https://repo1.maven.org/maven2/com/oracle/database/jdbc/ucp/21.3.0.0/ucp-21.3.0.0.jar
问题是你尝试子类化 PoolDataSourceImpl,这是一个使用 JDK8 编译的特定于供应商的类,我们不支持扩展我们的类,除非我们明确建议这样做,如本博客所示; 所有软件供应商都是如此。 作为此限制的一部分,我们的驱动程序(ojdbc8.jar,ucp.jar(与较新的JDK版本(即使用JDK11(和数据库版本向前兼容。
有了这个问题,在 PoolDataSource 上使用基于接口的代理代理将永远不起作用。 在oracle ucp上记录了一个错误。我什至发布了一个论坛查询,但没有回复这个 https://community.oracle.com/thread/4325841。
就我而言,我使用的是Java 8,但仍然收到此异常,问题的根本原因是数据库团队升级了Oracle客户端,并且必须在应用程序服务器中相应地更改ORACLE_HOME配置。示例:旧:Oracle 客户端版本 12.x.x新增功能:Oracle 客户端版本 19.x.x