【问题标题】:How is JDBC Batch Update helpful? [closed]JDBC 批量更新有何帮助? [关闭]
【发布时间】:2013-01-10 18:38:47
【问题描述】:

每个人都说批量更新可以减少 JDBC 调用的数量。有人可以解释一下“JDBC 调用”是什么意思,以及与在一个 JDBC 调用中承载全部负载相比,增加此类调用的数量如何更昂贵。

【问题讨论】:

  • 查看“每个人都这么说”的任何博客、SO 答案等,他们几乎总是会解释原因。如果您不理解解释,请在此处提出后续问题。或者阅读 JDBC 文档。
  • 如何评估通过多个 JDBC 调用发送多个东西比通过一个 jdbc 调用发送所有东西的成本更高。在一个实例中,我们通过一个 JDBC 调用承载负载,在另一个实例中我们通过多个 jdbc 调用分配相同的负载。

标签: java jdbc


【解决方案1】:

通俗地说,当开发人员使用短语JDBC 调用 时,他们谈论的是通过线路将信息发送到数据库。 JDBC API 的批处理功能允许您在单个网络调用中提交多个离散操作,而不是对每个 SQL 语句的调用。来自JDBC spec

批量更新工具允许 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();

【讨论】:

  • 在一种情况下,我们通过一个单独的 JDBC 调用来承载负载,而在另一种情况下,我们通过多个 jdbc 调用来分配相同的负载。如何评估哪个更昂贵。
  • @jonathan.cone:批处理是否在单个事务中执行?如果其中一个查询未能执行怎么办?它会恢复吗?
【解决方案2】:

IBM's documentation中所述:

支持 JDBC 2.0 及以上版本的 JDBC 驱动支持批处理 更新。使用批量更新,而不是更新 DB2(R) 的行 一次一张表,你可以直接 JDBC 执行一组更新 同时。可以包含在同一批次中的语句 更新被称为批处理语句。

如果语句有输入参数或宿主表达式,你可以 仅将该语句包含在具有其他实例的批处理中 同样的声明。这种类型的批次称为均质批次。如果 语句没有输入参数,您可以将该语句包含在 仅当批处理中的其他语句没有输入时才批处理 参数或主机表达式。这种类型的批次被称为 异质批次。可以包含在同一个语句中的两个语句 批次被称为批次兼容。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 只有当数据库确实支持批处理执行时才适用,否则驱动程序将通过执行与逐个执行语句时相同的调用来“模拟”批处理执行。
    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    相关资源
    最近更新 更多