executeBatch()详解
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增、删除等)的情况下可以大幅度提升系统的性能。
// 关闭自动执行
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 命令(它们只返回简单的更新计数)才能作为批处理的一部分来执行。如果应用程序决定不提交已经为某语句构
1
2
3
造的命令批处理,则可以调用方法 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 int 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 executeBatch
* may be one of the following:
executeBatch方法返回的数组中的元素可能是下面几种情形之一:
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
一个大于或等于零的数字,简单说来命令成功执行后就返回它所影响到的行的数目
A value of SUCCESS_NO_INFO – 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来说明命令执行情况。
* If one of the commands in a batch update fails to execute properly,
* this method throws aBatchUpdateException, 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
*BatchUpdateException.getUpdateCounts
* 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()方法返回
的数组应该包括批处理中有的那些命令的结果,并且至少有一个元素的值是下面的情况:
A value ofEXECUTE_FAILED-- 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,并且只有在命令出错后驱动继续执行的情况下才会出现,
如果出错后不再执行,则返回的结果中没有错误信息只有那些被成功执行后的结果。
* 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 aBatchUpdateExceptionobejct 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 ofSQLException) 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的子类。
标签: executeBatch最近更新
- 最新:宁夏首条高铁5G网络全线开通2023-01-09
- 5项数字化转型国家标准正式立项2023-01-09
- 漯河联通“六抓六促”推广党建负责人工作法2023-01-09
- 【速看料】泰安移动开展“四个一”抓实抓牢节前廉洁教育2023-01-09
- 我国大数据产业规模达1.3万亿元复合增长率超30%2023-01-09
- 宿州移动警企联动“重拳打猫”再添战果2023-01-09
- 焦点热议:中国联通故障中心平台及网络智能运维机器人系统获“优秀级”认证2023-01-09
- 浙江联通实现省内重点城市“一市一池”全覆盖|焦点快看2023-01-09
- 苹果服软!iPhone 15曝光:全系标配USB-C、灵动岛 Pro版还有钛合金2023-01-09
- 每日观察!未来要取代iPhone!苹果AR/VR头戴设备将春季发布:原型机已发放2023-01-09
- 快看:“天灾加人祸”,特斯拉的好日子到头了?2023-01-09
- 【全球热闻】支付宝2023年“集五福”来了 网友:两块钱的大项目2023-01-09
- 全球今头条!马斯克承诺成空谈!推特被裁员工仅获1个月工资补偿2023-01-09
- 微软Xbox老大斯宾塞盛赞索尼:无障碍手柄是对PS生态很好的补充2023-01-09
- 每日资讯:暴雪网易复合几乎不可能:不会降低标准 正和新代理谈的火热2023-01-09
- 苹果砍单“链条”受过 “果链”上市公司另寻出路2023-01-09
- 天天热资讯!紫辉创投郑刚再呛罗永浩:多次退出锤子科技股东群,用新公司股权要挟投资人放弃基本权利2023-01-07
- 投资人炮轰罗永浩“势利眼”,曾参与锤子科技两轮融资,称其是中国乔布斯|全球通讯2023-01-07
- 天天观点:罗永浩发文回应投资人郑刚2023-01-07
- 罗永浩回应郑刚炮轰:锤子每年都开股东会,新公司已给老股东股权补偿2023-01-07
- 蚂蚁集团股东上层结构调整、马云不再为实控人,继续强化与阿里的隔离_全球新要闻2023-01-07
- 二叠纪大灭绝期间紫外线辐射增加?化石花粉粒中“防晒霜”添证据|全球快资讯2023-01-07
- 湖北西部秭归盆地首次发现侏罗纪中期恐龙足迹化石-环球讯息2023-01-07
- 观察:蚂蚁集团大动作!马云退出实控人位置,股东投票权进一步分散,拟引入第五名独董2023-01-07
- 罗永浩回应投资人“炮轰”:郑刚对我的评论毫无事实基础-环球快报2023-01-07
- 网传马云现身曼谷:吃路边摊看泰拳比赛 还上阵打了一通2023-01-07
- 投资人郑刚炮轰罗永浩 全球快看2023-01-07
- 全球实时:蚂蚁强化与阿里隔离 马云股份表决权变了2023-01-07
- 刚刚,蚂蚁集团发布重要公告!_环球快播2023-01-07
- 锤子手机投资人、紫辉创投创始人郑刚深夜炮轰罗永浩:不懂感恩2023-01-07