Dao操作中的时间戳毫秒区别

时间:2014-01-07 09:06:05

标签: java mysql timestamp

我有这个非常简单的dao操作,它工作得非常好(JUnit测试的一部分):

for (int i = 0 ; i < 5000 ; i++)
   mUserDao.saveUser(lUser, new Date().getTime());

第二个参数是一个时间戳作为长值。我测试了一种批量保存。

我的问题是:理论上可能我的数据库(mysql)中有两个具有相同long值的条目吗? - 在同一过程中。

关系中的第一眼看到我显示每个entrie的不同长值(至少最后一毫秒增加)。

提前谢谢

的Stefan

3 个答案:

答案 0 :(得分:1)

是的,尤其是如果您拥有快速硬件并且同时完成两项保存操作时,这是可能的。然后两个创建的条目将具有相同的Long值。

答案 1 :(得分:1)

您无法保证new Date()能准确地为您提供当前时间。通常它可能会错误达到大约10毫秒。致电new Date()时会使用System.currentTimeMillis()currentTimeMillis()的Javadoc说

  

以毫秒为单位返回当前时间。请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

所以它依赖于操作系统。我的经验是,Windows在为您提供准确的约会方面特别糟糕。

你当然不能保证你会在连续拨打new Date()后得到不同的日期。

答案 2 :(得分:1)

我认为自UNIX时代以来的毫秒仍然是以合理准确的方式测量时间的最佳方式。但是,仅将时间戳作为主键并不是一件好事。只要您拥有唯一的主键,就不需要唯一的时间戳。

如果由于某种原因您仍然希望时间戳是唯一的,您可以应用“人工涂抹”。例如:

long last = 0;
for (int i = 0 ; i < 5000 ; i++) {
   long now = new Date().getTime();
   if (now <= last) {
      now = last + 1;
   }
   last = now;
   mUserDao.saveUser(lUser, now);
}

有很多方法可以改进,但上面的代码只是为了说明涂片的想法。