【问题标题】:Weird Date issue with Hibernate in Karaf OSGI serverKaraf OSGI 服务器中 Hibernate 的奇怪日期问题
【发布时间】:2016-12-18 21:51:41
【问题描述】:

我们正在进行一个升级我们的 OSGi 服务器应用程序的项目:

  • 卡拉夫 2.3.1
  • OSGi 核心 4.3.0
  • 休眠 3.4.0 正式版
  • Spring(包括 SpringDM)3.2.2.RELEASE
  • c3p0 连接池 0.9.1.2
  • PostgreSQL 驱动程序 9.1.901

收件人:

  • 卡拉夫 4.0.5
  • OSGi 核心 6.0.0
  • 休眠 5.0.9.Final
  • Hikari 连接池 2.4.3
  • PostgreSQL 驱动程序 9.4-1204-jdbc42

新版本使用声明式服务而不是 Spring DM。

转换后,我们开始在从数据库中检索日期时遇到问题。任何包含新西兰今年(9 月 25 日)夏令时转换日期的日期都会得到不一致的结果。我们在服务器启动后查询此日期的前 5 次,日期是正确的。但是,之后它会更改为之前的日期。也就是说,如果数据库包含“2016-09-25”,则返回“2016-09-24”。

最初我们认为这是一个 JPA 实体填充问题,但我们现在已将其范围缩小为一个非常简单的原生查询:

em.createNativeQuery("SELECT DATE '2016-09-25'").getResultList()

它在前几次返回一个带有 25 号时间 00:00 的 Date 对象,然后它返回一个带有 24 号时间 11:00 之后的 Date 对象。

奇怪的是,如果我们添加时间,像这样:

em.createNativeQuery("SELECT DATE '2016-09-25 00:00:00'").getResultList()

那么我们总是会得到一个 Date 对象,它是 25 日,时间 00:00。

我们尝试过的:

  • 执行简单 JDBC 查询的基本测试程序 - 每次都能正常工作
  • Karaf 之外的休眠实体管理器 - 每次都能正常工作
  • 2016 年 9 月 25 日以外的日期 - 每次都可以正常工作

我可以理解,无论是否应用夏令时都会产生这些日期值之一。我无法理解的是为什么它不一致。

【问题讨论】:

    标签: java postgresql hibernate osgi apache-karaf


    【解决方案1】:

    事实证明这毕竟是 PostgreSQL 驱动程序的问题。见this discussion on the pgjdbc github site。和这个配置设置有关:

    • prepareThreshold = int

    确定在切换到使用服务器端准备好的语句之前所需的 PreparedStatement 执行次数。默认值为 5,表示在同一 PreparedStatement 对象的第五次执行时开始使用服务器端准备好的语句。

    如果我对讨论的理解正确,则在执行相同准备语句的次数达到准备阈值后,Postgres 会切换到在服务器上使用二进制准备语句,并且这些语句的时区不正确。

    另请参阅 PostgreSQL JDBC 文档中的“Server Prepared Statements”部分。

    我们的测试中有一些红鲱鱼。该问题仅在使用准备好的语句时才会出现,这就是为什么我们在 Karaf 之外的测试是可以的,因为我们在这些测试中没有使用准备好的语句,而 Hibernate 总是使用准备好的语句。

    问题至少在 9.4-1204-jdb42 版本(我们使用的版本)之前一直存在,但是在 9.4.1208 版本中问题不再存在。我们已升级到此驱动程序版本,问题已消失。我们原来的服务器使用的是 9.1 版本,也没有问题。

    【讨论】:

      【解决方案2】:

      听起来 karaf 设置的一些“环境”变量与在 karaf 之外设置的变量不同。我不确定它到底是什么。我建议在休眠列表上也问这个。

      【讨论】:

      • 对不起,克里斯蒂安,Karaf 的事情最终是一个红鲱鱼。请看我的回答。
      猜你喜欢
      • 2014-04-24
      • 2015-04-19
      • 2013-05-23
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多