JDBC batch批处理Statement executeBatch 具体解释

JDBC batch批处理Statement executeBatch 具体解释

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

 

JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下能够大幅度提升系统的性能。我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系统进行改造,採用了batch处理的方式,删除5万条数据基本上不会超过1分钟。看一段JDBC代码:

// 关闭自己主动运行
con.setAutoCommit(false);
Statement stmt = con.createStatement();

stmt.addBatch(“INSERT INTO employees VALUES (1000, ‘Joe Jones’)”);
stmt.addBatch(“INSERT INTO departments VALUES (260, ‘Shoe’)”);
stmt.addBatch(“INSERT INTO emp_dept VALUES (1000, 260)”);

// 提交一批要运行的更新命令
int[] updateCounts = stmt.executeBatch();

    本例中禁用了自己主动运行模式,从而在调用 Statement.executeBatch() 时可以防止 JDBC 运行事务处理。禁用自己主动运行使得应用程序可以在错误发生及批处理中的某些命令不能运行时决定是否运行事务处理。因此,当进行批处理更新时,通常应该关闭自己主动运行。

    在JDBC 2.0 中,Statement 对象可以记住可以一起提交运行的命令列表。创建语句时,与它关联的命令列表为空。Statement.addBatch() 方法为调用语句的命令列表加入�一个元素。假设批处理中包括有试图返回结果集的命令,则当调用 Statement. executeBatch() 时,将抛出 SQLException。仅仅有 DDL 和 DML 命令(它们仅仅返回简单的更新计数)才干作为批处理的一部分来运行。假设应用程序决定不提交已经为某语句构
造的命令批处理,则能够调用方法 Statement.clearBatch()(以上没有显示)来又一次设置批处理。

    Statement.executeBatch() 方法将把命令批处理提交给基本 DBMS 来运行。命令的运行将按照在批处理中的加入�顺序来进行。ExecuteBatch() 为运行的命令返回更新计数数组。数组中相应于批处理中的每一个命令都包括了一项,而数组中各元素根据命令的运行顺序(这还是和命令的最初加入�顺序同样)来排序。调用executeBatch() 将关闭发出调用的 Statement 对象的当前结果集(假设有一个结果集是打开的)。executeBatch() 返回后,将又一次将语句的内部批处理命令列表设置为空。

    假设批处理中的某个命令无法正确运行,则 ExecuteBatch() 将抛出BatchUpdateException。能够调用BatchUpdateException.getUpdateCounts() 方法来为批处理中成功运行的命令返回更新计数的整型数组。由于当有第一个命令返回错误时,Statement.executeBatch() 就中止,并且这些命令是根据它们在批处理中的加入�顺序而运行的。所以假设 BatchUpdateException.getUpdateCounts() 所返回的数组包括 N 个元素,这就意味着在调用 executeBatch() 时批处理中的前 N 个命令被成功运行。用PreparedStatement 能够象以下这样写代码:

// 关闭自己主动运行
con.setAutoCommit(false);
PreparedStatement stmt = con.prepareStatement(“INSERT INTO employees VALUES (?, ?)”);

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

// 提交要运行的批处理
int[] updateCounts = stmt.executeBatch();

========================================

PrepareStatement 也是接口
PrepareStatement extends Statement
PrepareStatement 本身没有 int[] executeBatch() throws SQLException 方法
而是继承了Statement的方法,且它们都是接口没有实际实现方法,但Statement
接口对executeBatch()方法做了规范
/**
     * Submits a batch of commands to the database for execution and
     * if all commands execute successfully, returns an array of update counts.
       每次提交一批命令到数据库中运行,假设全部的命令都成功运行了,那么返回一个
       数组,这个数组是说明每条命令所影响的行数
     * The <code>int</code> elements of the array that is returned are ordered
     * to correspond to the commands in the batch, which are ordered
     * according to the order in which they were added to the batch.
       返回的数组中每一个整型值都是排过序的,它们的顺序和批量处理中的命令们是一致的,
       命令的顺序是依照它们被加到批处理中的顺序一致。
     * The elements in the array returned by the method <code>executeBatch</code>
     * may be one of the following:
       executeBatch方法返回的数组中的元素可能是以下几种情形之中的一个:
     * <OL>
     * <LI>A number greater than or equal to zero — indicates that the
     * command was processed successfully and is an update count giving the
     * number of rows in the database that were affected by the command’s
     * execution
       一个大于或等于零的数字,简单说来命令成功运行后就返回它所影响到的行的数目
     * <LI>A value of <code>SUCCESS_NO_INFO</code> — indicates that the command was
     * processed successfully but that the number of rows affected is
     * unknown
       
      * The constant indicating that a batch statement executed successfully
      * but that no count of the number of rows it affected is available.
      int SUCCESS_NO_INFO = -2;
      常量SUCCESS_NO_INFO代表的值=-2,也就是说命令运行成功了但命令影响到的行数
      无法统计,是未知的,仅仅能返回SUCCESS_NO_INFO来说明命令运行情况。
     * <P> * If one of the commands in a batch update fails to execute properly,
     * this method throws a <code>BatchUpdateException</code>, and a JDBC
     * driver may or may not continue to process the remaining commands in
     * the batch.
       假设批量处理时当中一个命令运行失败,则会抛出一个异常BatchUpdateException
       JDBC驱动可能会停止剩余的命令,也可能继续运行剩余的命令。
     * However, the driver’s behavior must be consistent with a
     * particular DBMS, either always continuing to process commands or never
     * continuing to process commands.
       无论如何,驱动要怎么做取决于数据库管理系统的细节,总是运行或总是不运行两者其一。
     * If the driver continues processing
     * after a failure, the array returned by the method
     * <code>BatchUpdateException.getUpdateCounts</code>
     * will contain as many elements as there are commands in the batch, and
     * at least one of the elements will be the following:
       发生失败后假设驱动继续运行,通过BatchUpdateException.getUpdateCounts()方法返回
       的数组应该包含批处理中有的那些命令的结果,而且至少有一个元素的值是以下的情况:
     * <P>
     * <LI>A value of <code>EXECUTE_FAILED</code> — indicates that the command failed
     * to execute successfully and occurs only if a driver continues to
     * process commands after a command fails
           int EXECUTE_FAILED = -3;
           指示命令没有成功运行的常量值EXECUTE_FAILED,而且仅仅有在命令出错后驱动继续运行的情况下才会出现,
           假设出错后不再运行,则返回的结果中没有错误信息仅仅有那些被成功运行后的结果。
     * </OL>
     * <P> * A driver is not required to implement this method.
     * The possible implementations and return values have been modified in
     * the Java 2 SDK, Standard Edition, version 1.3 to
     * accommodate the option of continuing to proccess commands in a batch
     * update after a <code>BatchUpdateException</code> obejct has been thrown.
       驱动不实现此方法,可能会出现的实现和返回值在Java 2 SDK,Standard Edition,
       version 1.3 ,以适应批处理时抛出BatchUpdateException 异常后是继续运行还是
       终止运行的选项。
      
     * @return an array of update counts containing one element for each
     * command in the batch. The elements of the array are ordered according
     * to the order in which commands were added to the batch.
       返回一个和加入�命令时的顺序一样的数组结果
     * @exception SQLException if a database access error occurs or the
     * driver does not support batch statements. Throws {@link BatchUpdateException}
     * (a subclass of <code>SQLException</code>) if one of the commands sent to the
     * database fails to execute properly or attempts to return a result set.
     * @since 1.3
     */
       假设数据库訪问异常或驱动不支持批处理命令,或者假设一个命令发送到数据库时失败或尝试取得结果集
       时失败,都会抛一个异常BatchUpdateException 它是SQLException的子类。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118836.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 大数据采集技术概述

    大数据采集技术概述大数据采集是指从传感器和智能设备、企业在线系统、企业离线系统、社交网络和互联网平台等获取数据的过程。数据包括RFID数据、传感器数据、用户行为数据、社交网络交互数据及移动互联网数据等各种类型的结构化、半结构化及非结构化的海量数据。不但数据源的种类多,数据的类型繁杂,数据量大,并且产生的速度快,传统的数据采集方法完全无法胜任。所以,大数据采集技术面临着许多技术挑战,一方面需要保证数据…

    2022年6月24日
    28
  • clion永久激活码2021_在线激活

    (clion永久激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    235
  • 04 _ 可扩展架构案例(一):电商平台架构是如何演变的?[通俗易懂]

    04 _ 可扩展架构案例(一):电商平台架构是如何演变的?[通俗易懂]本章,我就针对最近十几年电商平台的架构变化过程,来具体说明下,为了支持业务的快速发展,架构是如何一步步演进的。从2003年淘宝上线开始,国内电商平台经历了高速的发展,在这个过程中,系统遇到了很多的挑战,比如说:如何针对当前的业务现状,选择合适的架构呢?如何在业务发展过程中,升级改造架构,并保证系统的平滑过渡呢?接下来,我会结合自己的工作实践,和你一起探讨架构的演变历程,你可以从中了解到各种架构的优劣点和适用性,然后在实际工作中选择合适的架构。这里,我总结了国内电商平台架构发展的大致过程,你可以结合图片

    2022年6月16日
    34
  • javaweb酒店管理系统设计与实现_酒店管理信息系统分析与设计

    javaweb酒店管理系统设计与实现_酒店管理信息系统分析与设计随着人们生活质量的提高和对网络的依赖,对酒店的需求量越来越大并且更需要网络来实现预订酒店等功能,它作为一个服务性行业,从客房的营销即客人的预定开始,到入住登记直到最后退房结账,整个过程应该能够体现以宾客为中心,提供快捷方便服务,给宾客感受一种顾客至上的享受,提高管理水平,简化各种复杂操作,在最短时间内完成酒店业务规范操作,这样才能令旅客舒适难忘。目前,我国酒店服务业信息化管理的进程缓慢,跟国外的酒店相比管理依然落后。在激烈的酒店业竞争中,如何能把握机会,保持自己的优势,立于不败之地呢?这就需要提供最好的服务

    2025年11月20日
    7
  • uuid截取_jsp获取session中的值

    uuid截取_jsp获取session中的值switch_core_session_t*session=NULL;if(!(session=switch_core_session_locate(channel_uuid))){       return;}

    2022年8月10日
    5
  • mysql的建表语句_mysql如何查询建表语句

    mysql的建表语句_mysql如何查询建表语句mysql建表语句mysql安装教程见博客:MySQL7.7.25图文安装教程(Win10)本篇博客以学生表、课程表以及学生-课程表为例,讲解mysql常用的建表语句。1.学生表Sno(学号)Sname(姓名)Sex(性别)Sage(年龄)Sdept(系)201215121李勇男20CS201215122刘晨女19CS201215…

    2025年10月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号