JDBCのバッチ処理機構


[coolxing按:転載は作者と出典を明記してください。誤謬があれば、コメントの中でご指摘ください。] 
 
複数のsql文をデータベースに送信する必要がある場合、実行効率を向上させるために、JDBCを採用したバッチ処理の仕組みが考えられます。JDBCのバッチ処理の仕組みは主にSttementまたはPreparedSttementオブジェクトに関する以下の方法です。
(124)--addBatch(String sql):Sttement類の方法では、複数のsql文をSttementオブジェクトのコマンドリストに追加することができます。一括でこれらのsql文をデータベースに送信して処理します。
この方法は、複数のプリコンパイルされたsql文をPreparedSttementオブジェクトのコマンドリストに追加することができます。バッチ処理を実行するときは、これらのsql文をデータベースに送信して処理します。
()--executeBatch():SttementオブジェクトまたはPreparedSttementオブジェクト命令リストのすべてのsql文をデータベースに送信して処理します。
|--clearBatch(): 現在のsqlコマンドのリストを空にします。
 
 
/*
 * create table batch_test(id int primary key auto_increment, name varchar(40), age int);
 */
public class BatchTest {
	@Test
	public void statementBatch() {
		Connection conn = null;
		Statement st = null;
		String sql_1 = "insert into batch_test(name, age) values('coolxing', 24)";
		String sql_2 = "insert into batch_test(name, age) values('coolmin', 22)";
		String sql_3 = "insert into batch_test(name, age) values('yong', 21)";
		String sql_4 = "update batch_test set name='java' where id=1";

		try {
			conn = JdbcUtils.getConnection();
			st = conn.createStatement();
			st.addBatch(sql_1);
			st.addBatch(sql_2);
			st.addBatch(sql_3);
			st.addBatch(sql_4);
			st.executeBatch();
			st.clearBatch();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.release(null, st, conn);
		}
	}

	@Test
	public void preparedStatementBatch() {
		Connection conn = null;
		PreparedStatement st = null;
		String sql = "insert into batch_test(name, age) values(?, ?)";

		try {
			conn = JdbcUtils.getConnection();
			st = conn.prepareStatement(sql);
			for (int i = 0; i < 10002; i++) {
				st.setString(1, "coolxing_" + i);
				st.setInt(2, i);
				st.addBatch();
				//     Preparedstatement                sql  ,    outOfMemory  
				if (i % 500 == 0) {
					st.executeBatch();
					st.clearBatch();
				}
			}
			//                
			st.executeBatch();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtils.release(null, st, conn);
		}
	}
}
 
 
まとめ:Sttement.addBatch(sql)方式でバッチ処理を実現するためには、データベースに異なる種類のsql文を送信することができますが、これらのsql文はプリコンパイルされておらず、実行効率は高くありません。各sql文をリストする必要があります。PreparedSttement.addBatch()は、タイプが異なるsql文にのみ適用できます。このような形式のバッチ処理は、しばしば同じテーブルにデータを一括挿入したり、テーブルのデータを一括更新したりするために用いられる。
コマンドリストにsql文を一度に追加しないように注意してください。outOfMemoryエラーが発生しないようにしてください。