在 Spring Boot 上使用 H2 数据库批量插入

问题描述 投票:0回答:2

我按照这个示例(如何使用 JpaRepository 进行批量(多行)插入?)并创建了一个 h2 数据库示例案例。但批量插入不起作用。

型号:

@Table(name = "user")
@Entity
public class User
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    private String name;
}

存储库:

public interface IUserRepository extends JpaRepository<User, Long>
{
}

测试:

@SpringBootApplication
public class SpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }

    @Bean
    ApplicationRunner init(IUserRepository userRepository)
    {
        return args -> {
            User user = new User();
            user.setName("Test-1");

            User user1 = new User();
            user1.setName("Test-2");
            userRepository.saveAll(Arrays.asList(user, user1));
        };
    }

}

特性:

spring.datasource.url=jdbc:h2:~/test;TRACE_LEVEL_FIle=4
spring.jpa.hibernate.ddl-auto=create
spring.datasource.username=sa
spring.jpa.properties.hibernate.jdbc.batch_size=5

输出:

/*SQL #:1*/call next value for hibernate_sequence;
2021-02-28 15:13:35.110  INFO 43465 --- [           main] h2database                               
/*SQL l:58 #:1*/SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME=? {1: 'QUERY_TIMEOUT'};
2021-02-28 15:13:35.119  INFO 43465 --- [           main] h2database                               
/*SQL #:1*/call next value for hibernate_sequence;
2021-02-28 15:13:35.136  INFO 43465 --- [           main] h2database                               
/*SQL l:41 #:1*/insert into user (name, id) values (?, ?) {1: 'Test-1', 2: 1};
2021-02-28 15:13:35.137  INFO 43465 --- [           main] h2database                                
/*SQL l:41 #:1*/insert into user (name, id) values (?, ?) {1: 'Test-2', 2: 2};
2021-02-28 15:13:35.139  INFO 43465 --- [           main] h2database                               
/*SQL */COMMIT;
2021-02-28 15:13:35.139  INFO 43465 --- [           main] h2database                               
/*SQL */COMMIT;

如何使用 Spring-Boot 测试 h2-database 中的批量插入?或者说有可能吗?

spring-boot h2 bulkinsert
2个回答
0
投票

这里的 spring boot 不是负责批量插入的,它是 hiberate (或您正在使用的 jpa 提供程序),它只是发生在 spring but 应用程序中运行。

Spring boot 为您提供了配置 hibernate 的方法和配置键,但本质上您正在配置的是 hibernate。

使休眠批量插入的内容是:

    spring.jpa.properties.hibernate.jdbc.batch_size=5
    spring.jpa.properties.hibernate.order_inserts=true

更新:

spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.batch_versioned_data=true

0
投票

正如亚历山大·彼得罗夫指出的那样

它在日志中记录多个语句这一事实并不意味着它没有进行批处理。并非每个数据库都支持具有一次插入和多个值的 SQL。

我在 H2 中也面临同样的问题,我看到两个 SQL 更新。 但如果我通过

打开统计数据
spring.jpa.properties.hibernate.generate_statistics=true

我得到例如这个

1354250 nanoseconds spent executing 1 JDBC batches;
© www.soinside.com 2019 - 2024. All rights reserved.