JDBC批量更新有什么用处?

13

大家都说批量更新可以减少JDBC调用的次数。请问“JDBC调用”是什么意思,为什么与一次性调用所有负载相比,增加这种调用的次数更加昂贵。


2
看看任何博客、SO答案等,他们几乎总是解释了为什么会这样说。如果你不理解解释,可以在那里提出跟进问题。或者阅读JDBC文档。 - abarnert
1
如何评估发送多个东西通过多个JDBC调用比通过一个JDBC调用发送所有内容更昂贵。在一个实例中,我们通过一个单一的JDBC调用承载负载,在另一个实例中,我们通过多个JDBC调用分配相同的负载。 - cooper
3个回答

12

开发人员在口语中使用“JDBC调用”一词时,他们指的是通过网络将信息发送到数据库。JDBC API的批处理功能允许您在单个网络调用中提交多个离散操作,而不是针对每个SQL语句进行调用。根据JDBC规范

批量更新功能允许Statement对象将一组异构的SQL语句作为单个单元或批次一起提交到底层数据源。

对于PreparedStatement,仅需创建单个语句的额外好处存在。这使您能够使用多个绑定参数集执行相同的查询,而无需将语句本身多次添加到批处理中。最终结果是更少的网络流量及其相关的开销。

规范中的一个示例:

PreparedStatement stmt = con.prepareStatement(
"INSERT INTO employees VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();

// submit the batch for execution
int[] updateCounts = stmt.executeBatch();

1
在一个实例中,我们通过一个单一的JDBC调用来承载负载,在另一个实例中,我们通过多个JDBC调用分配相同的负载。如何评估哪一个更昂贵。 - cooper
1
@jonathan.cone:批处理是否在单个事务中执行?如果其中一个查询无法执行,会回滚还是不会? - Gaurav

6
根据IBM文档的描述:
支持JDBC 2.0及以上版本的JDBC驱动程序支持批处理更新。使用批处理更新,您可以将JDBC指示同时执行一组更新,而不是逐个更新DB2(R)表的行。可以包含在同一批次更新中的语句称为可批处理语句。
如果语句具有输入参数或主机表达式,则只能将该语句包含在具有同一语句实例的批中。这种类型的批次称为同质批次。如果语句没有输入参数,则只能在其他语句没有输入参数或主机表达式的批次中将该语句包含在批次中。这种类型的批处理称为异构批处理。可以包含在同一批次中的两个语句称为批处理兼容。

1

在调用JDBC更新时,Java程序连接到数据库服务器并执行查询。这意味着对于每个更新,Java程序都会联系数据库服务器并执行查询。现在,如果我们使用JDBC批量更新,则Java应用程序只需要联系一次数据库服务器并在数据库服务器上执行所有查询,然后返回给Java应用程序。

简而言之,它将减少Java应用程序和数据库服务器之间的往返。通常两者都在不同的服务器上,因此它将减少大量网络资源。因此,它实现了更好的性能。


1
只有当数据库实际支持批处理执行时,这才是真的。否则,驱动程序将通过执行与逐个执行语句相同的调用来“模拟”批处理执行。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接