从ojdbc6 / jdk6升级到ojdbc8 / jdk8破坏了TIMESTAMPTZWrapper。无法将TIMESTAMPTZWrapper投射到TIMESTAMPTZ

时间:2018-12-18 12:28:38

标签: oracle java-8 eclipselink ojdbc

我们最近针对一个11g Oracle数据库提升了使用ojdbc6在JDK6下编写的一个主要应用程序。在同一个11g数据库上使用JDK8令人振奋,但我们也在升级到12c的过程中。升级后的代码已经针对11g数据库在生产中运行,但是比以前慢。针对我们质量检查环境中的12c数据库,我们注意到作业抛出异常或运行速度非常慢。当我查看代码时,我注意到分配用于提升代码的项目团队未能将ojdbc从6升级到至少8。此后,我已经完成了这项工作,但是现在提交以下代码会出错:< / p>

    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。

感谢您对此事的协助。

1 个答案:

答案 0 :(得分:1)

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

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