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的子类。
JDBC batch批量Statement executeBatch 详细解释的更多相关文章
- JDBC batch批处理Statement executeBatch 具体解释
JDBC提供了数据库batch处理的能力,在数据大批量操作(新增.删除等)的情况下能够大幅度提升系统的性能.我曾经接触的一个项目,在没有採用batch处理时,删除5万条数据大概要半个小时左右,后来对系 ...
- JDBC批量执行executeBatch
JDBC事务 在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态.为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这 ...
- JDBC之批量处理
JDBC之批量处理 一.批量处理JDBC语句提高处理速度 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 ...
- JDBC的批量批量插入
本文部分转载于:http://blog.itpub.net/29254281/viewspace-1151785/ http://www.cnblogs.com/chenjianjx/archive/ ...
- JDBC的批量插入操作
在今天之前,当我遇到需要使用JDBC对数据库进行批量插入操作的时候,我使用的方法如下: ①使用Connection建立数据库连接: ②使用PreparedStatement提交SQL语句,将数据插入: ...
- jdbc实现批量提交rollback
最近上了一个老项目,要修改一些业务,具体的思路是在jsp中实现对数据的某些批量操作,因此做一下笔记. 1.整体jdbc建立连接/关闭连接 conn = DbUtil.getConnection(); ...
- 严重: Could not synchronize database state with session org.hibernate.exception.DataException: Could not execute JDBC batch update
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #ff2600 } p.p2 { margin: 0.0px 0 ...
- Could not execute JDBC batch update; SQL [delete from role where roleId=?]; constraint [null]; neste
今天在写多个删除功能的时候出现了这么一个错误:意思是删除操作的时候,没有找到对应的外键. Cannot delete or update a parent row: a foreign key con ...
- Java -- JDBC 学习--批量处理
批量处理JDBC语句提高处理速度 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率JDBC的批量处理语句包 ...
随机推荐
- Linux编程return与exit区别
Linux编程return与exit区别 exit 是用来结束一个程序的执行的,而return只是用来从一个函数中返回. return return 表示从被调函数返回到主调函数继续执行,返回时可附 ...
- Linux 之 rsyslog
Linux 之 rsyslog 系统日志转发 一.rsyslog 介绍 ryslog 是一个快速处理系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多 ...
- VSTO之旅系列(四):创建Word解决方案
原文:VSTO之旅系列(四):创建Word解决方案 本专题概要 引言 Word对象模型 创建Word外接程序 小结 一.引言 在上一个专题中主要为大家介绍如何自定义我们的Excel 界面的,然而在这个 ...
- Twitter僵尸帐号厂商雇佣中国员工专填验证码_Web2.0 - Microblogging 微博_cnBeta.COM
Twitter僵尸帐号厂商雇佣中国员工专填验证码_Web2.0 - Microblogging 微博_cnBeta.COM Twitter僵尸帐号厂商雇佣中国员工专填验证码
- android移植pppoe拨号上网的全过程
硬件环境:Tiny6410开发板 软件环境:fedora14 + Android 2.3.4 + linux-2.6.36 所需资源:rp-pppoe-3.11.tar.gz http://www.r ...
- 使用SVNkit删除版本库的文件
源网址:http://wiki.svnkit.com/Committing_To_A_Repository Editing Operation: commiting to a repository T ...
- SVNKIT一段代码的分析
打印SVNkit版本库中的结构: 函数如下: 调用方法如下: listEntries(repository, ""); System.out.println("XXXXX ...
- android系统reboot
这里所说的reboot指的是软件重启,并非断电重启.我们知道android系统的几个功能,比如:回复出厂设置.OTA升级等都需要重启系统,而且重启后要进入recovery模式,有的手机还带有重启进入f ...
- 屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能载入页面
发如今家里的时候用Android App里的WebView打开站点非常慢,会有十几秒甚至更长时间的卡住. 可是在电脑上打开相同的网页却非常快. 查找这个问题的过程比較曲折,记录下来. 抓取Androi ...
- 蚁群算法 matlab程序(已执行)
下面是解放军信息project大学一个老师编的matlab程序,请尊重原作者劳动,引用时请注明出处. 我经过改动添加了凝视,已经执行过,无误, function [R_best,L_best,L_av ...