JDBC: 批量处理提高SQL处理速度

   当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
多条SQL语句的批量处理;

一个SQL语句的批量传参;

测试代码:

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.Statement;

import org.junit.Test;

import xuezaipiao1.JDBC_Tools;
/**
 * 向Oracle 的 temp 数据表中添加  10万 条记录
 * 测试如何插入,用时最短
 */

public class JDBCTest {
	
	/**
	 * 
	 * 1.使用 Statement .
	 * 测试用时:35535
	 */
	@Test
	public void testBbatchStatement() {
		Connection conn = null;
		Statement statement = null;
		String sql = null;
		try {
			conn = JDBC_Tools.getConnection();
			JDBC_Tools.beginTx(conn);
			
			long beginTime = System.currentTimeMillis();
			statement = conn.createStatement();
			for(int i = 0;i<100000;i++){
				sql = "INSERT INTO temp values("+(i+1)
						+",'name_"+(i+1)+"','13-6月 -15')";
				statement.executeUpdate(sql);
			}
			long endTime = System.currentTimeMillis();
			System.out.println("Time : "+(endTime - beginTime));
			JDBC_Tools.commit(conn);
		} catch (Exception e) {
			e.printStackTrace();
			JDBC_Tools.rollback(conn);
		}finally{
			JDBC_Tools.relaseSource(conn, statement);
		}
	}
	
	/**
	 * 使用PreparedStatement 
	 * 测试用时:9717
	 */
	@Test
	public void testBbatchPreparedStatement() {
		Connection conn = null;
		PreparedStatement ps = null;
		String sql = null;
		try {
			conn = JDBC_Tools.getConnection();
			JDBC_Tools.beginTx(conn);
			
			long beginTime = System.currentTimeMillis();
			sql = "INSERT INTO temp values(?,?,?)";
			ps = conn.prepareStatement(sql);
			Date date = new Date(new java.util.Date().getTime());
			for(int i = 0;i<100000;i++){
				ps.setInt(1, i+1);
				ps.setString(2, "name_"+i);
				ps.setDate(3, date);
				ps.executeUpdate();//9717
			}
			long endTime = System.currentTimeMillis();
			System.out.println("Time : "+(endTime - beginTime));
			JDBC_Tools.commit(conn);
		} catch (Exception e) {
			
			e.printStackTrace();
			JDBC_Tools.rollback(conn);
		}finally{
			JDBC_Tools.relaseSource(conn, ps);
		}
	}
		
	/**
	 * 测试用时 : 658
	 */
	@Test
	public void testBbatch() {
		Connection conn = null;
		PreparedStatement ps = null;
		String sql = null;
		try {
			conn = JDBC_Tools.getConnection();
			JDBC_Tools.beginTx(conn);
			
			long beginTime = System.currentTimeMillis();
			sql = "INSERT INTO temp values(?,?,?)";
			ps = conn.prepareStatement(sql);
			Date date = new Date(new java.util.Date().getTime());
			for(int i = 0;i<100000;i++){
				ps.setInt(1, i+1);
				ps.setString(2, "name_"+i);
				ps.setDate(3, date);
				
				//积攒SQL
				ps.addBatch();
				
				//当积攒到一定程度,就执行一次,并且清空记录
				if((i+1) % 300==0){
					ps.executeBatch();
					ps.clearBatch();
				}
			}
			//总条数不是批量值整数倍,则还需要在执行一次
			if(100000 % 300 != 0){
				ps.executeBatch();
				ps.clearBatch();
			}
			long endTime = System.currentTimeMillis();
			System.out.println("Time : "+(endTime - beginTime));
			JDBC_Tools.commit(conn);
		} catch (Exception e) {
			
			e.printStackTrace();
			JDBC_Tools.rollback(conn);
		}finally{
			JDBC_Tools.relaseSource(conn, ps);
		}
	}
}



你可能感兴趣的:(JDBC: 批量处理提高SQL处理速度)