我有这个非常简单的dao操作,它工作得非常好(JUnit测试的一部分):
for (int i = 0 ; i < 5000 ; i++)
mUserDao.saveUser(lUser, new Date().getTime());
第二个参数是一个时间戳作为长值。我测试了一种批量保存。
我的问题是:理论上可能我的数据库(mysql)中有两个具有相同long值的条目吗? - 在同一过程中。
关系中的第一眼看到我显示每个entrie的不同长值(至少最后一毫秒增加)。
提前谢谢
的Stefan
答案 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);
}
有很多方法可以改进,但上面的代码只是为了说明涂片的想法。