`
xly_971223
  • 浏览: 1283928 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC批处理使用起来要小心

阅读更多
看下面的方法
Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i < 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.executeUpdate();
				[color=red]conn.commit(); //每次都提交[/color]
			}
			
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}

循环每次都开启一个事务 插入一千条数据 耗时 29078 ms
Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i < 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.executeUpdate();
				
			}
			conn.commit(); //只提交一次
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}

只开启一次事务  耗时 703 ms
但这不是推荐用法,jdbc有一个批处理方法 专门处理这种批量操作的 ps.addBatch();

Connection conn = getConnection();
		PreparedStatement ps = null;
		try {
			conn.setAutoCommit(false);
			ps = conn.prepareStatement("insert into t_user(username, password) values(?,?)");
			Random r = new Random();
			for(int i = 0; i < 1000; i++){
				ps.setString(1, String.valueOf(r.nextInt(Integer.MAX_VALUE)));
				ps.setString(2, String.valueOf(r.nextInt()));
				ps.addBatch();//加入批处理
				//ps.executeUpdate();不能与addBatch()同时用
				
			}
			int[] results = ps.executeBatch();//执行批处理
			conn.commit();
		} catch (SQLException e) {
			conn.rollback();
			throw e;
		}finally{
			ps.close();
			conn.close();
		}


批处理方式 耗时 781 ms

跟只开启一次事务效率差不多

这里要着重指出addBatch()和executeUpdate()不要同时用否则会导致记录插入两次
本来1000条记录 会插入2000条,本人在开始就翻了这个错误

第一种方法与第二 三种方法性能差别达 40倍 看来事务真是性能杀手啊 能少开尽量少开啦
4
0
分享到:
评论
6 楼 黄小胖 2015-07-14  
黄小胖 写道
我批处理的时候,就不想把autocommit给关了,让preparedstatement.executePatch()的时候自动更新处理提交,要不然怕一次性把事务提交了,服务器内存受不了


你批处理的时候,如果不关闭事务,只有在你新增Preparedstatement和执行更新的时候才会和数据库发生网络通讯,觉得没必要为了这点时间就把自动提交事务给关了。但如果你要从程序的稳定性来考虑,在报错的时候能进行回滚一系列操作的时候,关了自动提交事务还是比较好的。。
5 楼 黄小胖 2015-07-14  
我批处理的时候,就不想把autocommit给关了,让preparedstatement.executePatch()的时候自动更新处理提交,要不然怕一次性把事务提交了,服务器内存受不了
4 楼 dean_deng 2012-02-14  
1楼说的事务超长很有可能就是因为插入完一笔数据后,没有及时置空PreparedStatement中的参数,造成参数累积过多,事务超长。
3 楼 dean_deng 2012-02-14  
当你插入完一笔数据后,及时置空PreparedStatement中的参数,也很重要,
ps.clearParameters()在for循环中也应该使用对性能提升也有显著影响。
2 楼 greathjt 2010-01-21  
唉,真不知道未来在哪里?
1 楼 yangwen13 2009-11-26  
但是,你还是得控制好事务的大小,如果数据量一大,就有可能发生事务超长的问题。

相关推荐

    jdbc 批处理.rar

    "jdbc 批处理.rar"这个压缩包很可能包含了一些关于如何使用JDBC进行批处理的示例代码或教程。 批处理主要涉及到以下关键知识点: 1. **Statement对象的设置**:在JDBC中,`Statement`或`PreparedStatement`对象是...

    使用JDBC的批处理功能

    本文将详细阐述JDBC批处理的基本概念、优势以及如何在实际应用中使用。 一、批处理的概念 批处理是指一次性提交多个SQL语句到数据库进行执行,而不是逐个发送和执行。在JDBC中,批处理主要通过Statement或...

    JDBC的批处理操作三种方式

    JDBC的批处理操作三种方式JDBC的批处理操作三种方式JDBC的批处理操作三种方式JDBC的批处理操作三种方式JDBC的批处理操作三种方式

    JDBC数据库操作值MySQL批处理操作

    MySQL批处理是JDBC提供的一种优化数据库操作的方法,它允许开发者一次提交多个SQL语句,从而提高数据处理效率。本文将深入探讨JDBC在MySQL数据库中的应用,以及如何实现批处理操作。 首先,理解JDBC的基础知识至关...

    JDBC批处理数据

    通过上述示例可以看出,使用JDBC批处理能够显著提高数据处理的速度和效率,特别是在处理大量数据时。为了进一步优化性能,还可以考虑以下几点: - **批量提交大小:** 调整批处理中SQL语句的数量,找到最佳的批量...

    用pinyin4j 获取拼音简码 + JXL 读写Excl文件 + JDBC 批处理

    例如,如果你需要更新大量用户的数据,可以使用JDBC批处理来批量更新,减少网络通信和数据库事务处理的开销。 结合这三个技术,我们可以实现一个功能强大的系统。例如,一个基于Web的应用可能需要从用户上传的Excel...

    JDBC高级批处理

    **JDBC高级批处理** Java Database Connectivity (JDBC) 是Java平台中用于与数据库交互的一组接口和类,它是Java标准API的一部分,允许Java开发者执行SQL语句并处理结果。在处理大量数据时,JDBC提供了批处理功能,...

    JDBC笔记 方立勋

    方立勋老师的JDBC笔记还会深入到JDBC的高级特性,如JDBC批处理、连接池的使用、JNDI数据源、以及JDBC的最新版本特性等,这些都是Java开发者必须掌握的技能。通过这些笔记的学习,读者将能够熟练地使用JDBC进行数据库...

    JDBC进行批处理共4页.pdf.zip

    **JDBC批处理详解** 在Java数据库连接(Java Database Connectivity, JDBC)中,批处理是一项重要的功能,它允许开发者一次性提交多个SQL语句,从而提高数据处理的效率和性能。批处理是数据库操作中的优化手段,...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    首先,JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一种规范,它允许程序员使用SQL语句直接操作数据库。在批量插入场景下,JDBC提供了Statement对象的addBatch()和executeBatch()方法,可以将...

    jdbc 增删改查事物处理, 批处理,以及预编译示例代码

    在Java数据库连接(JDBC)中,增删改查(CRUD)操作是与数据库交互的基础,事务处理、批处理和预编译SQL语句则是提高效率和保证数据一致性的关键技术。以下是对这些概念的详细说明: 1. **JDBC增删改查(CRUD)**:...

    关于hibernate的批处理

    10. **JDBC批处理API**: Hibernate底层使用JDBC的批处理API(Statement.addBatch()和Statement.executeBatch()),用户也可以直接使用JDBC批处理,绕过Hibernate的部分逻辑,获取更高的性能。 11. **性能优化注意...

    jdbc使用参考手册

    ** JDBC使用参考手册详解 ** Java Database Connectivity (JDBC) 是Java编程语言中用于与数据库交互的一组标准API。这个英文版的JDBC使用参考手册是开发者的重要资源,提供了全面的指南来帮助理解和掌握JDBC的各个...

    jdbc完整流程使用

    本教程将详细介绍使用JDBC进行数据库连接、操作的基本步骤和核心概念。 1. **安装JDBC驱动** 首先,你需要为你的数据库选择合适的JDBC驱动。例如,如果你使用的是MySQL,你需要下载`mysql-connector-java`的JAR...

    JDBC教程

    理解JDBC对于任何想要在Java环境中操作数据库的开发者来说至关重要。 ### 1. JDBC API介绍 JDBC API提供了一系列的接口和类,主要分为以下几类: - **DriverManager**: 连接管理类,负责注册和加载数据库驱动,...

    JDBC详解(连接操作数据库、处理大数据、批处理)

    ### JDBC详解:连接操作数据库、处理大数据、批处理 #### 一、JDBC简介 JDBC,全称为Java DataBase Connectivity(Java数据库连接),是Sun公司(现已被Oracle收购)为了解决不同数据库间的操作差异性而设计的一套...

    Oracle12C JDBC 驱动

    在开发过程中,还需要注意兼容性和性能优化,例如选择合适的JDBC批处理大小,使用预编译的SQL语句避免解析开销,以及正确处理异常以避免资源泄露。了解Oracle12C的JDBC驱动特性以及如何有效利用它们,对于开发高效、...

    jdbc jdbc jdbc

    6. **批处理(Batch Processing)**:对于需要执行大量相似SQL语句的情况,JDBC提供批处理功能,允许一次发送多个SQL语句,从而提高效率。 7. **JDBC URL**:每个数据库驱动都有一个特定的JDBC URL格式,用于标识要...

    JDBCDriver3.0.rar_jdbc driver 3.0_sql jdbc 3.0_sql server jdbc_s

    JDBC Driver 3.0是针对Java开发者的重要组件,它允许Java应用程序与各种数据库进行交互,包括我们今天要探讨的Microsoft SQL Server。本文将深入解析JDBC Driver 3.0以及其在SQL Server环境中的应用。 JDBC Driver ...

    spring batch批处理 教程

    - 批量操作数据库:利用JDBC批处理功能优化数据库操作性能。 - Job多个Step的执行:Job可以包含多个Step,根据需要组合执行。 - 条件流程和流程决策:使用Flow和Decision元素创建条件分支和流程控制。 - 并发处理:...

Global site tag (gtag.js) - Google Analytics