Statement中的批处理

当一个Statement对象创建的时候,它的批处理队列是空的。通过调用addBatch()方法,可以将作为参数的SQL语句加入队列中。特别需要指出的是,遵照JDBC3.0规范,所有加入队列的SQL语句必须是执行后返回结果为更新记录数的语句(即insert,delete, update语句和DDL语句),否则执行executeBatch将抛出SQLException异常。

如果不打算提交批更新队列中的SQL语句,需要调用clearBatch方法来清空批处理队列。执行批处理更新使用executeBatch方法即可。需要注意的一点:在使用批处理更新之前必须先禁用AutoCommit模式。

下面是一个例子:

package com.sun.cts.tests.jdbc.help_doc.pi_chu_li;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;

import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import org.junit.Test;

public class StatementTest {
	private Connection con;
	public String DBUSER = "";
	public String DBPASSWD = "";
	public String DBURL = "";
	public String DBDRIVER = "";

	public void init() {
		Properties prop = new Properties();
		try {

			FileInputStream in = new FileInputStream(
					"." + File.separator + "testFile" + File.separator + "cts_env.properties");
			prop.load(in);
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		// DBUSER = "sysdba";
		DBUSER = prop.getProperty("DBUSER");
		// DBPASSWD = "szoscar55";
		DBPASSWD = prop.getProperty("DBPASSWD");
		// DBURL = "jdbc:oscar://localhost:2003/osrdb";
		DBURL = prop.getProperty("DBURL");
		// DBDRIVER = "com.oscar.Driver";
		DBDRIVER = prop.getProperty("DBDRIVER");
		try {
			Class.forName(DBDRIVER);
			con = DriverManager.getConnection(DBURL, DBUSER, DBPASSWD);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void execute() {
		init();
		try {
			Statement stmt = con.createStatement();
			String sql;
			// 创建表
			sql = "CREATE TABLE TEMP" + "(id INT not NULL,name varchar(255),PRIMARY KEY ( id ))";
			stmt.executeUpdate(sql);
			// 改变auto-commit模式
			con.setAutoCommit(false);
			// 设置SQL语句
			stmt.addBatch("INSERT INTO TEMP VALUES(1,'shentong1')");
			stmt.addBatch("INSERT INTO TEMP VALUES(2,'shentong2')");
			stmt.addBatch("INSERT INTO TEMP VALUES(3,'shentong3')");
			// 执行批处理更新
			int[] updateCounts = stmt.executeBatch();
			assertNotNull(updateCounts);
			con.commit();
			// 查询数据
			sql = "SELECT * FROM TEMP";
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				//处理
			}
			// 删除表
			sql = "DROP TABLE TEMP ";
			stmt.executeUpdate(sql);

			rs.close();
			stmt.close();
			con.close();
		} catch (Exception e) {
			fail(e.getMessage());
		}

	}

	public static void main(String[] args) {
		new StatementTest().execute();
	}
}

最后说明一点,在批处理队列当中不允许设置保存点(savepoint)。如果要设置,必须在第一条SQL语句被添加到批处理队列中之前。

OscarStatement的异步批处理

神通oscarJDBC驱动提供批处理时以异步方式发送数据的方式,示例如下,表示启用异步方式发送数据,每次发送的行数为10。

Statement stmt = conn.createStatement();
(OscarStatement)stmt.setUseAsynBatch(true);
(OscarStatement)stmt.setBatchCount (10);