Java JDBC中的批插入-单个事务的速度会慢多少?

Java JDBC中的批插入-单个事务的速度会慢多少?,java,postgresql,jdbc,Java,Postgresql,Jdbc,我刚刚发现JDBC的addBatch操作,如果给定“INSERT INTO mytable(id,name)VALUES(?),将创建如下内容: BEGIN TRANSACTION INSERT INTO mytable (id, name) VALUES (1, "a"); INSERT INTO mytable (id, name) VALUES (2, "b"); ... END TRANSACTION 与这样的语句相比:“INSERT INTO mytable(id,name)VA

我刚刚发现JDBC的addBatch操作,如果给定“INSERT INTO mytable(id,name)VALUES(?),将创建如下内容:

BEGIN TRANSACTION
INSERT INTO mytable (id, name) VALUES (1, "a"); 
INSERT INTO mytable (id, name) VALUES (2, "b");
...
END TRANSACTION 

与这样的语句相比:
“INSERT INTO mytable(id,name)VALUES(1,“a”),(2,“b”),…”
,大规模事务的速度会慢多少?I/O中的差异会有重大影响吗

批处理通常比其他处理更快

下面是几个案例,假设这是相同的连接,给你一个想法:

  • 自动提交已启用。数据库写入发送日志。批处理速度更快
  • 自动提交已启用。数据库不写入发送日志。同样的速度,网络问题可能会导致批处理速度加快
  • 自动提交已关闭。数据库写入发送日志。第(2)项中的相同内容
  • 自动提交已关闭。数据库不写日志。第(2)段中的内容相同

  • 由于查询通常在TX中通过日志记录执行,并且网络是一个瓶颈,因此批处理通常更快。出于同样的原因,ORM框架提供了一种以批处理模式执行查询的工具。

    PgJDBC批处理通常不如多值插入快速,但它更方便

    到目前为止,最有效的选择是通过使用
    COPY
    命令

    第二种选择是打开一个事务,进行批量多值插入(比如说)每次插入10行,然后进行一组单行插入以弥补差异,然后进行提交

    PgJDBC批处理的速度不应明显快于打开事务、准备语句、使用准备好的语句在数据上循环发送每一行,然后执行显式提交。我不认为它当前在一个批处理中同时有多个语句,但我不确定这一点,如果它有,那么当网络延迟是一个因素时,批处理会显著加快


    我建议对其进行测试,并了解其影响。

    我认为批处理是为了消除网络往返和延迟。显然,发送一批N个操作与执行N个操作,每个操作有一个往返会有很大的不同。