当前位置: 首页 > 知识库问答 >
问题:

如何在r2dbc中批量执行多个插入?

张宝
2023-03-14

我需要在一个批处理中向一个表中插入多行。在DatabaseClient中,我找到了insert()语句,并使用了(Publisher objectToInsert)方法,该方法有多个对象作为参数。但它是否会将它们放入一批中?另一种可能的解决方案是连接。createBatch(),但它有一个drowback:我无法在那里传递我的实体对象,也无法从实体生成sql查询。

那么,可以在r2dbc中创建批插入吗?

共有2个答案

穆文斌
2023-03-14

目前还没有直接的支持,但我发现可以使用连接来简单地克服这个障碍,看看这个问题,spring-data-r2dbc#259

语句有一个add来重复绑定参数。

我的解决方案的完整代码可以在这里找到。

        return this.databaseClient.inConnectionMany(connection -> {

            var statement = connection.createStatement("INSERT INTO  posts (title, content) VALUES ($1, $2)")
                    .returnGeneratedValues("id");

            for (var p : data) {
                statement.bind(0, p.getTitle()).bind(1, p.getContent()).add();
            }

            return Flux.from(statement.execute()).flatMap(result -> result.map((row, rowMetadata) -> row.get("id", UUID.class)));
        });

此方法的测试。

@Test
    public void testSaveAll() {

        var data = Post.builder().title("test").content("content").build();
        var data1 = Post.builder().title("test1").content("content1").build();

        var result = posts.saveAll(List.of(data, data1)).log("[Generated result]")
                .doOnNext(id->log.info("generated id: {}", id));

        assertThat(result).isNotNull();
        result.as(StepVerifier::create)
                .expectNextCount(2)
                .verifyComplete();
    }

生成的id按预期在控制台中打印。

...
2020-10-08 11:29:19,662 INFO [reactor-tcp-nio-2] reactor.util.Loggers$Slf4JLogger:274 onNext(a3105647-a4bc-4986-9ad4-1e6de901449f)
2020-10-08 11:29:19,664 INFO [reactor-tcp-nio-2] com.example.demo.PostRepositoryTest:31 generated id: a3105647-a4bc-4986-9ad4-1e6de901449f
//.....
2020-10-08 11:29:19,671 INFO [reactor-tcp-nio-2] reactor.util.Loggers$Slf4JLogger:274 onNext(a611d766-f983-4c8e-9dc9-fc78775911e5)
2020-10-08 11:29:19,671 INFO [reactor-tcp-nio-2] com.example.demo.PostRepositoryTest:31 generated id: a611d766-f983-4c8e-9dc9-fc78775911e5
//......

Process finished with exit code 0

劳鹏云
2023-03-14

有两个问题:

DatabaseClient。insert()是否一批插入?

不是一批。

可以在r2dbc中创建批插入吗?(除了Connection.createBatch())

否,使用连接。createBatch()目前是创建批处理的唯一方法。

另请参见问题:

  • spring-data-r2dbc#259
  • spring框架#27229
 类似资料:
  • 本文向大家介绍如何执行批量插入?相关面试题,主要包含被问及如何执行批量插入?时的应答技巧和注意事项,需要的朋友参考一下 首先,创建一个简单的 insert 语句:   然后在 java 代码中像下面这样执行批处理插入:

  • 问题内容: 我有许多记录需要输入到表中。在查询中执行此操作的最佳方法是什么?我是否应该进行循环并在每次迭代中插入一条记录?或者,还有更好的方法? 问题答案: 从MySQL手册 使用VALUES语法的INSERT语句可以插入多行。为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。例:

  • 问题内容: 我想一次删除多个数据库条目。仅当3个字段匹配时(此处为:姓名,电子邮件,年龄),才能删除每个条目。 如果我只想删除一个属性,则可以选择: 但是,如果我的病情是由多个领域构成的,那该怎么办? 条件应始终匹配所有3个字段()! 问题答案: 使用方法。

  • 问题内容: 如果使用https://github.com/felixge/node- mysql之类的 东西,如何将大量插入MySQL中 问题答案: 使用嵌套数组可以进行大容量插入,请参见github页面 嵌套数组变成分组列表(用于批量插入),例如 变成 您只需插入一个嵌套的元素数组。 这里给出一个例子 注意:是一个包装在数组中的数组数组 还有用于批量插入的完全不同的node-msql软件包

  • 现在我正在尝试提高我的Web应用程序的性能,我使用Spring JPA 2.3.0-Hibernate 5.4.15。最终,Postgres 12并通过@Transaction管理事务。Web应用程序部署在aws beanstek上,同时运行多个实例,但数据库实例不可扩展。我使用bigSerial类型作为表的ID。 例如,我有一个学生表,ID是bigSerial和其他一些列。我在使用时遇到了一些问

  • 问题内容: 使用hibernate时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来在这种情况下缺少的是: 现在我明白了 频繁得多(任何大于1的值基本上都意味着它成功完成了批量插入)。 hibernate.jdbc.batch_versioned_data也可能有用。 jdbc:mysql:// localhost:3306 /