Java Spring Boot JPA-是否可以使用IDENTITY generator或等效工具批量插入?

Java Spring Boot JPA-是否可以使用IDENTITY generator或等效工具批量插入?,java,mysql,spring,spring-boot,jpa,Java,Mysql,Spring,Spring Boot,Jpa,我最近发现了Spring Boot JPA 2.2.6和Mysql 8中的批插入 要使批插入工作正常,我必须更改以下内容: @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false) private long id; 致: 具有一些附加属性: spring: jpa: properties:

我最近发现了Spring Boot JPA 2.2.6和Mysql 8中的批插入

要使批插入工作正常,我必须更改以下内容:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private long id;
致:

具有一些附加属性:

spring:
  jpa:
    properties:
      hibernate:
        generate_statistics: true
        jdbc:
          batch_size: 1000
        order_inserts: true
        order_updates: true
当我使用单个服务器实例进行测试时,批插入似乎可以正常工作。但我刚刚注意到,当有两个API实例时,id增量无法正常工作

似乎正在发生的是:

  • POST创建一个实体并将其保存在MySQL数据库中。实例1接收到该请求。实体的id为1
  • POST创建一个实体并将其保存在MySQL数据库中。请求由实例2接收(循环请求路由)。将引发以下异常:

  • 当我希望使用批插入时,如何防止在使用多个实例时引发重复密钥异常,同时确保每个新实体始终在多个实例中获取下一个可用的递增id?

    GenerationType.IDENTITY
    不允许批插入。例如,您可以看到这一点

    事实上,当使用多个实例时,此代码将不起作用。因为策略
    增量
    使用
    增量生成器
    实现。在这里,您可以看到缓存了数据库中的最大ID值。因此,如果应用程序的另一个实例插入了一个值,那么当前实例将永远不会知道该值

    要解决您的问题,您可以使用

        @Id
        @GeneratedValue
        private UUID id;
    
    或者您应该将数据库更改为PostgreSQL,然后必须使用
    sequence
    策略


    如果这些选项不适合您,您可以在
    DefaultIdentifierGeneratorFactory

    GenerationType中看到生成标识符的其他策略的实现。IDENTITY
    不允许批量插入。例如,您可以看到这一点

    事实上,当使用多个实例时,此代码将不起作用。因为策略
    增量
    使用
    增量生成器
    实现。在这里,您可以看到缓存了数据库中的最大ID值。因此,如果应用程序的另一个实例插入了一个值,那么当前实例将永远不会知道该值

    要解决您的问题,您可以使用

        @Id
        @GeneratedValue
        private UUID id;
    
    或者您应该将数据库更改为PostgreSQL,然后必须使用
    sequence
    策略


    如果这些选项不适合您,您可以在
    DefaultIdentifierGeneratorFactory

    中看到生成标识符的其他策略的实现,您必须将其从
    long
    更改为
    long
    ,因为primative不能为null,但
    long
    可以为null。当您的id设置为null时,只要在数据库中正确设置,spring将自动获取下一个id,以增加id。您必须将其从
    long
    更改为
    long
    ,因为primative不能为null,但
    long
    可以。当您的id设置为null时,spring将自动获取下一个id,只要您在数据库中正确设置它以增加id。
        @Id
        @GeneratedValue
        private UUID id;