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

jdbc批处理

    博客分类:
  • jdbc
阅读更多

看下面的方法
Java代码
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();  
        } 

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();
  }
循环每次都开启一个事务 插入一千条数据 耗时 29078 ms
Java代码
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();  
        } 

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

Java代码
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();  
        } 

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倍 看来事务真是性能杀手啊 能少开尽量少开啦

分享到:
评论
2 楼 peterwei 2010-08-22  
事务影响确实很大,你是对的。我原来的测试Mysql数据库默认不是InnoDB.所以测试不准。
1 楼 peterwei 2010-08-21  
好像差别没有40倍喔。你看看我的代码。我感觉没什么区别。我第1种方法只用了2656ms.一起探讨一下。http://www.iteye.com/topic/744021

相关推荐

    jdbc 批处理.rar

    在给定的博客链接中,可能详细解释了这些概念,并提供了示例代码来演示如何在实际应用中实现JDBC批处理。通过学习这个资源,开发者可以更好地理解和应用批处理技术,提升Java数据库应用程序的效率。

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

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

    JDBC批处理数据

    ### JDBC批处理数据 在Java开发中,JDBC(Java Database Connectivity)是一种广泛使用的数据库连接技术,它允许Java应用程序与各种类型的数据库进行交互。当处理大量数据时,使用JDBC进行有效的数据操作变得尤为...

    JDBC笔记 方立勋

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

    使用JDBC的批处理功能

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

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

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

    JDBC的批处理操作三种方式

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

    JDBC高级批处理

    JDBC批处理的实现依赖于数据库驱动的实现,不同数据库的驱动可能会有不同的优化策略。深入研究JDBC源码,可以帮助我们理解批处理在底层是如何工作的,以及如何针对特定数据库优化性能。 ### 8. 工具支持 很多...

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

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

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

    2. **事务大小**:在JDBC中,可以通过设置合适的批处理大小来平衡性能和内存消耗。在Mybatis中,批处理的大小由flushStatements()的调用频率决定。 3. **数据库配置**:如InnoDB引擎的缓冲池大小、重做日志大小等,...

    关于hibernate的批处理

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

    51CTO下载-java-操作Oracle-批量入库的问题.pdf

    具体而言,他描述了在不同的方法下,如使用Oracle的自定义类型定义表类型、基本类型定义表类型以及JDBC批处理(JDBCBATCH)进行10000条数据的插入,并对比了它们的效率。为了分析这个问题,我们首先需要了解相关技术...

    smoke-tests-conf-0.2.0-incubating.zip

    《amplecode:高性能JDBC批处理操作框架》 在当今的IT行业中,数据库操作是许多应用程序的核心部分。高效、稳定且灵活的数据处理框架对于提升应用性能至关重要。amplecode,一个开源项目,以其高性能的JDBC批处理...

    JDBC教程

    JDBC批处理 批处理可以提高性能,通过批量执行多条SQL语句。可以使用Statement对象的`addBatch()`方法添加SQL语句到批处理队列,然后通过`executeBatch()`执行。 ### 6. JDBC性能优化 - 使用PreparedStatement...

    Oracle12C JDBC 驱动

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

    sqljdbc4-4.0.jar.rar

    - 支持JDBC批处理,可以批量提交SQL命令,减少网络往返,提高执行速度。 - 支持JTA (Java Transaction API),实现分布式事务处理。 - 支持Unicode,可以处理多种语言字符集的数据。 - 提供了SQL Server特有的函数和...

    openGauss-1.1.0-JDBC.tar.gz

    5. **JDBC批处理**:对于大量相似的SQL语句,JDBC的批处理功能可以提高效率,减少网络传输和数据库处理的开销。 6. **PreparedStatement**:预编译的SQL语句,可以防止SQL注入攻击,并提供性能优化,尤其在重复执行...

    sql2000+java 批处理,测试demo

    对于Java开发者来说,使用JDBC批处理可以有效地管理与数据库的交互,尤其是在处理大量数据时,能够显著提升性能。 【标签】"sql2000+java 批处理" 指明了技术栈,即使用Java编程语言与SQL Server 2000数据库进行...

    spring batch批处理 教程

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

    jdbc连接数据库的方式2

    我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的...

Global site tag (gtag.js) - Google Analytics