【问题标题】:Java 11 migration - createConnectionBuilder() from PoolDataSourceImpl clashes with createConnectionBuilder() from javax.sql.DataSourceJava 11 迁移 - PoolDataSourceImpl 中的 createConnectionBuilder() 与 javax.sql.DataSource 中的 createConnectionBuilder() 冲突
【发布时间】:2020-05-22 16:24:52
【问题描述】:

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

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

有人有什么建议吗?

【问题讨论】:

  • 你解决过这个问题吗?
  • 解决这个问题需要 Oracle 承认这是一个问题,并制作一个新的 UCP jar 次要版本并更正此问题。

标签: java oracle maven ojdbc ucp


【解决方案1】:

此问题在 21.3 中通过 ucp11.jar(使用 JDK11 编译的 UCP 版本)解决。在这个版本中,UCP oracle.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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      问题是你试图继承 PoolDataSourceImpl 这是一个使用 JDK8 编译的特定于供应商的类,我们不支持扩展我们的类,除非我们明确建议这样做,如 this blog;这适用于所有软件供应商。 由于此限制,我们的驱动程序(ojdbc8.jar、ucp.jar)与较新的 JDK 版本(即与 JDK11 一起使用)和数据库版本向前兼容。

      【讨论】:

      • 扩展是由 UCP jar 提供的。不幸的是,UCP 的第 19 版引入了一个新方法 createConnectionBuilder,同时 JDK 10 在 PoolDataSource 扩展的 DataSource 接口中引入了完全相同的名称。所以扩展是由 Oracle 提供的。
      • 没错。 UCP 实现了返回 OracleConnectionBuilder 的 createConnectionBuilder。在 Java 8 中,该方法是 Oracle 专有的,但在 Java 9 中 javax.sql.DataSource 定义了 createConnectionBuilder 返回一个 java.sql.DataSource。这在 Java 9 中运行良好,因为 oracle.jdbc.OracleConnectionBuilder 扩展了 ojdbc9|10|11.jar 中的 java.sql.ConnectionBuilder。但是 UCP 是用 Java 8 和 ojdbc8.jar 构建的,所以这不起作用。
      【解决方案4】:

      这是接口不兼容。 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 发布扩展 java.sql.ConnectionBuilder 的从未版本的 oracle.ucp.jdbc.UCPConnectionBuilder 接口,否则您将无法将 UCP PoolDataSource 与 javax.sql.DataSource 互换。

      此时的最新版本似乎是 UCP 19.3,它仍然会遇到同样的问题,这是不幸的,因为 19.3 被宣传为兼容 JDK11。请针对 Oracle UCP 提出一个 bug,让维护者了解 DataSource 接口中的新加入者 createConnectionBuilder。

      在 intrim 中,如果可行,您可以回退到使用 UCP 的 11g 第 2 版(不是 12,不是 19),它在 PoolDataSource 接口上没有方法 createConnectionBuilder。这不是一个理想的情况,因为您放弃了 UCP 十年来的改进,回到 11g。

      【讨论】:

      • 您是重新编译还是只是切换到 JDK 11?
      • 不确定@Kuassi Mensah 的这个问题是什么意思?我在尝试针对 JDK 11 进行编译时遇到了这个问题。
      • @ToddSharp 您已经回答了问题,即使用 JDK 11 重新编译了应用程序。
      猜你喜欢
      • 2017-01-24
      • 2019-11-23
      • 2020-10-17
      • 1970-01-01
      • 2019-08-27
      • 2019-01-07
      • 2013-06-02
      • 2020-10-02
      • 2016-08-07
      相关资源
      最近更新 更多