如何根据当前日期生成 UniqueId

新手上路,请多包涵

我正在生成一个 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 许可协议

阅读 491
1 个回答

发生这种情况是因为 for 循环的速度比你的 时间 快:)。因为循环在不到毫秒的时间内迭代并生成值。你只能在你想插入单个值时调用它数据库, _不要迭代值_。

除此之外,您可以使用 UUID 用于此目的( _用于字母数字值_)。

 for (int i = 0; i < 50; i++) {
        Date dNow = new Date();
        SimpleDateFormat ft = new SimpleDateFormat("yyMMddhhmmssMs");
        String datetime = ft.format(dNow);
        System.out.println(datetime);
}

输出

141016030003103
141016030003103
141016030003103
141016030003103
141016030003103
141016030003103
141016030003103
141016030003103
141016030003103
//.....and more

原文由 akash 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题