【问题标题】:Storing microseconds in a MySQL database在 MySQL 数据库中存储微秒
【发布时间】:2018-01-20 18:40:24
【问题描述】:

我有一个带有 ebeans 的 Play Framework 应用程序。为了在主系统和离线系统之间进行同步,我使用 addDate 字段来标识唯一记录。

这在开发和初始测试(使用 jdbc:h2:mem:play;MODE=MYSQL 进行开发)和使用有限数据集进行测试时非常有效。

但是在生产中,我发现在 MySQL 数据库中,并发用户不会存储毫秒数。我将字段创建为 datetime(6),但查询如下:

SELECT UNIX_TIMESTAMP(add_date) FROM `user` WHERE 1 

返回:

1499722493.000000
1499772800.000000
1499777225.000000
1499790922.000000
1499875868.000000
1499954855.000000
1499977124.000000
1499981148.000000
1499986822.000000

(ps.在MySQL中选择add_date字段返回2015-12-17 16:15:50.000000,显示精度就在那里)

因此不存储毫秒。在 Java 中,我使用普通的 Date 类,所以它们在其中(在 H2 男性测试数据库中也是如此)。

protected Date addDate;

如何使用我当前的配置将毫秒存储在数据库中,而不必重写太多代码?

[编辑:]

I am using MySQL on Debian: Ver 14.14 Distrib 5.6.35
sbt.version=0.13.11
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.16")
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2")
mysql-connector-java % 5.1.43

【问题讨论】:

  • 这有什么玩框架?
  • 它是一个 Play Framework 应用程序。在 ebeans 实现和 MySql 数据库之间的某个地方不存储毫秒。因此,这似乎是一个 Play Framework 问题。我是否需要添加注释以使实现以不同方式对待它,或者以不同方式定义字段?为什么它适用于 H2 人员而不适用于 MySQL?
  • 什么版本的 MySQL?
  • MySQL 版本 14.14。
  • 抱歉,Ver 14.14 Distrib 5.6.35。数据库上的分数/微秒没有问题,我对此进行了测试。我需要弄清楚如何将这种精度从我的 Play 应用程序保存到数据库中。

标签: java mysql datetime playframework playframework-2.0


【解决方案1】:

java.time

麻烦的java.util.Date 类现在被java.time 类所取代。

Instant 类表示UTC 中时间轴上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。

捕获当前时刻在 Java 8 中仅限于 milliseconds,但在 Java 9 和更高版本中扩展到纳秒级,new implementationClock。为了清楚起见,我再重复一遍:Java 8 和 Java 9 都可以存储纳秒的值,但只有 Java 9 及更高版本才能捕获比毫秒分辨率。

Instant instant = Instant.now() ;  // Captures milliseconds in Java 8 but nanoseconds in Java 9+.

使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序,以直接使用 java.time 类型而不是破解的 java.sql 类型。调用PreparedStatement::setObjectResultSet::getObject 方法。

myPreparedStatement.setObject( … , instant ) ;

……和……

Instant instant = myResultSet.getObject( … , Instant.class ) ; // Transfers a value with nanoseconds if present.

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    在java中你不能精确到微秒(纳秒)而不占用大量系统资源。您的日期以毫秒为单位插入,因为 java 以毫秒为单位。

    如果您想在 SQL 中使用微秒,您必须在插入时使用 SQL NOW()。

    【讨论】:

    • 谢谢,毫秒如果我觉得好的话,秒不够准确。但是我怎样才能让它发挥作用呢?由于 Play/eBeans 似乎与 h2/mem 选项一起使用,它是 Connector/J 接口吗?我用 datetime(6) 创建了我的表。
    • 对不起。我不知道,如果可以,请使用 NOW(),其余的都是浪费时间。日期的唯一 ID 也是一个大错误。
    • Java.sql.Timestamp 而不是 java.util.Date 可能是 TIMESTAMP mysql 类型
    • 我在 java 代码上尝试了 TIMESTAMP,但没有任何区别。我不将日期用作唯一 ID,而是将其用作两个独立系统之间的参考,因为相关项目可能具有不同的 ID。也许这将在未来的版本中得到解决,因为只有从 MySQL 5.6 开始,这才有可能并且适用于 H2。
    • 第一句话是什么意思?你能引用文档吗?
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多