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);
		}
	}
}

时间: 2024-10-08 22:10:57

JDBC: 批量处理提高SQL处理速度的相关文章

批量处理---提高处理速度

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

提高SQL Server数据库效率常用方法

1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优化 ●可以通过如下方法来优化查询 : 1.把数据.日志.索引放到不同的

jdbc批量插入实现大批量数据快速插入

今天在做一个将excel数据导入数据库的程序时,由于数据量大,准备采用jdbc的批量插入.于是用了preparedStatement.addBatch();当加入1w条数据时,再执行插入操作,preparedStatement.executeBatch().我原以为这样会很快,结果插入65536条数据一共花30多分钟,完全出乎我的意料.于是问了一下同事,他们在处理这种大批量数据导入的时候是如何处理的,发现他们也是用的jdbc批量插入处理,但与我不同是:他们使用了con.setAutoCommit

Mybatis批量操作与JDBC批量操作效率测试

Mybatis-spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springfr

DBA推荐的7法宝提高SQL查询性能

SQL查询数据库时,可以采取一系列的方式来提高查询的速度和性能.比如用case代替update,使用临时表和分批进行更新等.本文介绍了7种提高查询速度的方法,请读者参考. SQL查询数据库时,适当遵循一些原则可以让工作变得更加轻松,本文就列举7个可以灵活运用的原则,它们可以帮助你提高SQL查询速度,当然这些技巧你可以咨询DBA获得更多的信息. 1.用case代替update 要更新一条记录,我们立即会想到update,这个问题非常常见,许多开发人员经常忽视这个原则,因为使用update看起来非常

JDBC批量操作性能提升

JDBC 当使用INSERT INTO....VALUES()语句批量插入的时候,应该使用JDBC的PreparedStatement的批量操作方法,而不是采用一条一条执行的方法. 例如(来源:http://superjavason.iteye.com/blog/255423): 如上图,代码有3个关键的处理步骤: 1)关闭自动提交 2)addBatch 3)executeBatch 使用这种方法,SQLite测试时的效果提升非常明显,从 10000/s提升到100000/s(数据仅做参考,不能

JAVA 使用原生jdbc批量添加,表被锁住问题

今天用jdbc批量添加数据的时候遇到了一个问题,当数据添加成功过后,再想对该表进行操作发现表被锁住了,检查了下代码发现事务提交了呀!!!!!!!!!!!! 去网上查了大半天的资料才发现问题,在connection  commit过后需要加上 connection.setAutoCommit(true); 下面是示例代码 log.info("插入语句" + sql); //获取结果集 connection = JdbcUtils.getConnection(database.getMys

DeDeCMS后台批量修改替换sql语句大全

有时候后台文章内容.标题或者锚文本出错,需要修改批量修改,那么就需要用dedecms的sql语句进行批量修改了. 利用dedecms后台SQL命令行工具批量修改内容,路径和超链接等信息.语句 DEDECMS SQL命令批量替换1.更改文章中的内容update dede_addonarticle set body=replace(body,'原来的字符','替换后的字符')例子解释:update dede_addonarticle set body=replace(body,'软件下载','插件下

Spring JDBC 框架中, 绑定 SQL 参数的另一种选择:具名参数(named parameter)

使用spring的jdbcTemplate-----使用具名参数 在JDBC用法中,SQL参数是用占位符?表示,并且受到位置的限制,定位参数的问题在于,一旦参数的位置发生变化,必须改变参数的绑定,在Spring JDBC中,绑定SQL参数的另一种选择是使用具名参数,SQL具名参数是按照名称绑定,而不是位置绑定. 什么是具名参数? 具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代 具名参数只在 NamedP