我正在生成一个 OrderId,它应该由 yyMMddhhmmssMs 组成,这个 orderId 表示 Orders 表的主键字段。
我生成订单 ID 的方式如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTime {
public static String getCurrentDateTimeMS() {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyMMddhhmmssMs");
String datetime = ft.format(dNow);
return datetime;
}
public static void main(String args[]) throws InterruptedException {
for (int i = 0; i < 50; i++) {
String orderid = DateTime.getCurrentDateTimeMS();
System.out.println(orderid);
}
}
}
但是,当我使用 JMeter 对我的应用程序进行负载测试时,有 100 名用户的加速时间为 2 秒,其中大多数人都抛出了 Duplicate ,如下所示
java.sql.BatchUpdateException: Duplicate entry '1410160239241024' for key 'PRIMARY'
at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269)
at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955)
at com.services.OrdersInsertService.getData(OrdersInsertService.java:86)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
如何根据当前时间生成 UniqueId,以便无论有多少并发用户都不会失败。
原文由 user663724 发布,翻译遵循 CC BY-SA 4.0 许可协议
发生这种情况是因为
for
循环的速度比你的 时间 快:)。因为循环在不到毫秒的时间内迭代并生成值。你只能在你想插入单个值时调用它数据库, _不要迭代值_。除此之外,您可以使用
UUID
用于此目的( _用于字母数字值_)。输出