有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

共 (2) 个答案

  1. # 1 楼答案

    爪哇。时间

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

    ^{}类表示UTC中时间轴上的一个时刻,分辨率为nanoseconds(最多九(9)位小数)

    在Java8中,捕捉当前时刻的时间仅限于milliseconds,但在Java9中,捕捉当前时刻的时间扩展到了纳秒,之后是new implementation^{}。为了清楚起见,我将重复: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。时间类型,而不是黑客攻击的java。sql类型。调用PreparedStatement::setObjectResultSet::getObject方法

    myPreparedStatement.setObject( … , instant ) ;
    

    …还有

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

    关于java。时间

    java.time框架内置于Java8及更高版本中。这些类取代了麻烦的legacy日期时间类,比如^{}^{}、&^{}

    目前位于maintenance modeJoda-Time项目建议迁移到java.time

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

    在哪里可以获得java。时间课

    ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间你可以在这里找到一些有用的类,比如^{}^{}^{}more

  2. # 2 楼答案

    在java中,如果不占用大量系统资源,就无法精确到微秒(纳秒)。您的日期是以毫秒为单位插入的,因为java是以毫秒为单位插入的

    如果要从SQL使用微秒,则必须在插入时使用SQL NOW()