我有一个带有 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 men 测试数据库中)。
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
最佳答案
java.time
麻烦的java.util.Date
类现在被java.time取代。类。
Instant
类代表UTC中时间线上的一个时刻。分辨率为nanoseconds (最多九 (9) 位小数)。
捕获当前时刻仅限于 milliseconds在 Java 8 中,但在 Java 9 及更高版本中扩展到纳秒 new implementation的Clock
。为了清楚起见,我将重复一遍: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::setObject
和 ResultSet::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.Date
, Calendar
, & SimpleDateFormat
.
Joda-Time项目,现在位于 maintenance mode ,建议迁移到java.time类。
要了解更多信息,请参阅 Oracle Tutorial 。并在 Stack Overflow 上搜索许多示例和解释。规范为JSR 310 .
从哪里获取java.time类?
- Java SE 8 , Java SE 9 , 然后
- 内置。
- 是标准 Java API 的一部分,具有捆绑实现。
- Java 9 添加了一些小功能和修复。
- Java SE 6和 Java SE 7
- 许多 java.time 功能已向后移植到 ThreeTen-Backport 中的 Java 6 和 7 .
- Android
- ThreeTenABP项目专门针对 Android 改编了 ThreeTen-Backport(如上所述)。
- 参见How to use ThreeTenABP… .
ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
,和more .
关于java - 在 MySQL 数据库中存储微秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648866/