java在MySQL数据库中存储微秒
我有一个Ebens的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
(注:只需在MySQL return 2015-12-17 16:15:50.000000中选择add_date字段,即可显示精度)
所以毫秒不会被存储。在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
# 1 楼答案
爪哇。时间
麻烦的
java.util.Date
类现在被java.time类取代^{} 类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(最多九(9)位小数)
在Java8中,捕捉当前时刻的时间仅限于milliseconds,但在Java9中,捕捉当前时刻的时间扩展到了纳秒,之后是new implementation个^{} 。为了清楚起见,我将重复:Java 8和Java 9都可以以纳秒的速度存储值,但只有Java 9和更高版本可以以小于毫秒的分辨率捕获当前时刻
使用符合JDBC 4.2或更高版本的JDBC驱动程序直接使用java。时间类型,而不是黑客攻击的java。sql类型。调用
PreparedStatement::setObject
和ResultSet::getObject
方法…还有
关于java。时间
java.time框架内置于Java8及更高版本中。这些类取代了麻烦的legacy日期时间类,比如^{} 、^{} 、&^{}
目前位于maintenance mode的Joda-Time项目建议迁移到java.time类
要了解更多信息,请参阅Oracle Tutorial。并在Stack Overflow中搜索许多示例和解释。规范是JSR 310
在哪里可以获得java。时间课
ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{} 、^{} 、^{} 和more
# 2 楼答案
在java中,如果不占用大量系统资源,就无法精确到微秒(纳秒)。您的日期是以毫秒为单位插入的,因为java是以毫秒为单位插入的
如果要从SQL使用微秒,则必须在插入时使用SQL NOW()