【问题标题】:Upgrading from ojdbc6/jdk6 to ojdbc8/jdk8 has broken TIMESTAMPTZWrapper. Cannot cast TIMESTAMPTZWrapper to TIMESTAMPTZ从 ojdbc6/jdk6 升级到 ojdbc8/jdk 8 破坏了 TIMESTAMPTZ Wrapper。无法将 TIMESTAMPTZ Wrapper 转换为 TIMESTAMPTZ
【发布时间】:2018-12-18 12:28:37
【问题描述】:

我们最近针对 11g Oracle 数据库提升了一个使用 ojdbc6 在 JDK6 下编写的主要应用程序。在同一个 11g 数据库上使用 JDK8 得到了提升,但我们也在升级到 12c。提升的代码已经在生产环境中针对 11g 数据库运行,但比以前慢了。针对 QA 环境中的 12c 数据库,我们注意到作业要么抛出异常,要么运行速度非常慢。当我查看代码时,我注意到指定提升代码的项目团队未能将 ojdbc 从 6 升级到至少 8。我已经完成了这项工作,但现在我们在提交以下代码时遇到错误:

    Calendar endModDate = Calendar.getInstance();

    // get the timestamp from the db
    Query qry = em.createNativeQuery("select SYSTIMESTAMP from dual");
    TIMESTAMPTZWrapper tsTZWrapper = (TIMESTAMPTZWrapper)qry.getSingleResult();

em 是我们的实体管理器。但是当代码调用 qry.getSingleResult() 成员函数时,我们得到了这个错误:

oracle.sql.TIMESTAMPTZ 无法转换为 org.eclipse.persistence.internal.platform.database.oracle.TIMESTAMPTZWrapper

我已经从高处和低处搜索了答案,但任何类似于答案的东西似乎都无法解决我的解决方案。相同的逻辑用于代码的另一个区域并产生相同的问题。如果我们切换回 ojdbc6,它就可以工作,但我们不能使用 ojdbc6(我们真的不应该,因为我们使用的是 jdk8),因为我们需要在下个月升级到 Oracle 12c。

感谢您在此问题上的任何帮助。

【问题讨论】:

    标签: oracle java-8 eclipselink ojdbc


    【解决方案1】:

    快速评论一下 TIMESTAMP 数据类型:

    • JDBC 驱动程序中存在一个错误“错误 21891493:当 NANOSECONDS 为零时,JDBC 发送 NULL 的 TIMESTAMP SCALE”,这可能会导致在 Oracle 数据库中创建过多的子游标。此错误已在 12.2 JDBC 驱动程序中修复。
    • TIMESTAMP WITH TIMEZONE 数据类型在内部使用一个函数将 this 转换为 GMT。当您在其上创建索引时,在某些情况下不使用此基于函数的索引,尤其是当您将此列与不同子类型的 TIMESTAMP 值进行比较时。您应该比较 11g 和 12c 之间的执行计划。

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2021-06-18
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多