批量处理JDBC语句提高处理速度

1、当需要成批插入或这更新记录时,可以采用Java的批量更新机制,这一机制允许多跳语句一次性提交给数据库批量处理。
通常情况下,比单独提交处理更有效率。


2、JDBC的批量处理语句包括下面两个方法:

(1)addBacth(String sql):添加需要批量处理的sql语句或是参数。

(2)executeBatch():执行批量处理语句。


3、通常会遇到两种批量执行sql语句的情况:

(1)多条sql语句的批量处理。

(2)一个sql语句的批量传参。

4、JDBC批量处理

5、JDBC Statement对象执行批量处理实例

       /**
	 * 向  Oracle 的 customers 数据表中插入 10 万条记录
	 * 测试如何插入, 用时最短. 
	 * 1. 使用 Statement.
	 */
	@Test
	public void testBatchWithStatement(){
		Connection connection = null;
		Statement statement = null;
		String sql = null;
		
		try {
			connection = JDBCTools.getConnection();
			JDBCTools.beginTx(connection);
			
			statement = connection.createStatement();
			
			long begin = System.currentTimeMillis();
			for(int i = 0; i < 100000; i++){
				sql = "INSERT INTO customers VALUES(" + (i + 1) 
						+ ", 'name_" + i + "', '29-6月 -13')";
				statement.addBatch(sql);
			}
			long end = System.currentTimeMillis();
			
			System.out.println("Time: " + (end - begin)); //39567
			
			JDBCTools.commit(connection);
		} catch (Exception e) {
			e.printStackTrace();
			JDBCTools.rollback(connection);
		} finally{
			JDBCTools.releaseDB(null, statement, connection);
		}
	}

6、JDBC PrepareStatement对象执行批量处理实例

	@Test
	public void testBatch(){
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		String sql = null;
		
		try {
			connection = JDBCTools.getConnection();
			JDBCTools.beginTx(connection);
			sql = "INSERT INTO customers VALUES(?,?,?)";
			preparedStatement = connection.prepareStatement(sql);
			Date date = new Date(new java.util.Date().getTime());
			
			long begin = System.currentTimeMillis();
			for(int i = 0; i < 100000; i++){
				preparedStatement.setInt(1, i + 1);
				preparedStatement.setString(2, "name_" + i);
				preparedStatement.setDate(3, date);
				
				//"积攒" SQL 
				preparedStatement.addBatch();
				
				//当 "积攒" 到一定程度, 就统一的执行一次. 并且清空先前 "积攒" 的 SQL
				if((i + 1) % 300 == 0){
					preparedStatement.executeBatch();
					preparedStatement.clearBatch();
				}
			}
			
			//若总条数不是批量数值的整数倍, 则还需要再额外的执行一次. 
			if(100000 % 300 != 0){
				preparedStatement.executeBatch();
				preparedStatement.clearBatch();
			}
			
			long end = System.currentTimeMillis();
			
			System.out.println("Time: " + (end - begin)); //569
			
			JDBCTools.commit(connection);
		} catch (Exception e) {
			e.printStackTrace();
			JDBCTools.rollback(connection);
		} finally{
			JDBCTools.releaseDB(null, preparedStatement, connection);
		}
	}

	
       /**
	 * 向  Oracle 的 customers 数据表中插入 10 万条记录
	 * 测试如何插入, 用时最短. 
	 * 2. 使用 PreparedStatement.
	 */
@Testpublic void testBatch(){Connection connection = null;PreparedStatement preparedStatement = null;String sql = null;try {connection = JDBCTools.getConnection();JDBCTools.beginTx(connection);sql = "INSERT INTO customers VALUES(?,?,?)";preparedStatement = connection.prepareStatement(sql);Date date = new Date(new java.util.Date().getTime());long begin = System.currentTimeMillis();for(int i = 0; i < 100000; i++){preparedStatement.setInt(1, i + 1);preparedStatement.setString(2, "name_" + i);preparedStatement.setDate(3, date);//"积攒" SQL preparedStatement.addBatch();//当 "积攒" 到一定程度, 就统一的执行一次. 并且清空先前 "积攒" 的 SQLif((i + 1) % 300 == 0){preparedStatement.executeBatch();preparedStatement.clearBatch();}}//若总条数不是批量数值的整数倍, 则还需要再额外的执行一次. if(100000 % 300 != 0){preparedStatement.executeBatch();preparedStatement.clearBatch();}long end = System.currentTimeMillis();System.out.println("Time: " + (end - begin)); //569JDBCTools.commit(connection);} catch (Exception e) {e.printStackTrace();JDBCTools.rollback(connection);} finally{JDBCTools.releaseDB(null, preparedStatement, connection);}}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingzi123456789/article/details/80686507
个人分类: JDBC
上一篇JDBC数据库事务(二):数据库的隔离级别
下一篇JDBC数据库连接池的必要性
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭