`
superjavason
  • 浏览: 109482 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

三种JDBC批量插入编程方法的比较

    博客分类:
  • Java
阅读更多
JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件下的等。
我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试

  • 方法一,使用PreparedStatement加批量的方法
 
try {
      Class.forName("com.mysql.jdbc.Driver");
      conn = DriverManager.getConnection(o_url, userName, password);
      conn.setAutoCommit(false);
      String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";
      PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
      for(int x = 0; x < size; x++){
         prest.setString(1, "192.168.1.1");
         prest.setString(2, "localhost");
         prest.setString(3, "20081009");
         prest.setInt(4, 8);
         prest.setString(5, "11111111");
         prest.addBatch();
      }
      prest.executeBatch();
      conn.commit();
      conn.close();
} catch (SQLException ex) {
   Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
     Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);
}

说明下在建Statement的时候,后面两个参数的意义:
第一个参数指定 ResultSet 的类型。其选项有:
TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_INSENSITIVE:允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。
第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有:
CONCUR_READ_ONLY:这是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

  • 方法二 使用Statement加批量的方法

 
 conn.setAutoCommit(false);
 Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
 for(int x = 0; x < size; x++){
   stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");
 }
stmt.executeBatch();
conn.commit();


  • 方法三:直接使用Statement
conn.setAutoCommit(false);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                    ResultSet.CONCUR_READ_ONLY);
for(int x = 0; x < size; x++){
   stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");
}
conn.commit();


使用上述方法分别插入10万条数据的平均测试时间为:
方法一:17.844s
方法二:18.421s
方法三:16.359s

可以看出JDBC的batch语句插入不但没有性能提升,反而比没有用batch的时候要慢,当然这可能跟JDBC具体驱动的实现方法有关。 附件中是我测试代码,可以用来在自己电脑上跑一下。

在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。
conn.setAutoCommit(false)


个人觉得第一种方法是最方便最实用的。
6
4
分享到:
评论
4 楼 jurs30 2013-09-03  
好东西,多谢楼主分享
3 楼 hzw2312 2012-08-10  
费解万分、我也测试了一下、用Hibernate的save方法、一条条的添加
hqlDao.save(customer);

既然比用batch快很多
conn.setAutoCommit(false);  //取消自动提交
			Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);  
			for(int x = 0; x < map.size(); x++){  
				CustomerManageInfo newinfo = (CustomerManageInfo)map.get(x);
				StringBuffer sqlInsert = new StringBuffer();  
				sqlInsert.append("INSERT INTO CUSTOMERMANAGE_BASICE_INFO ");
                                //此处set省略......
				sqlInsert.append(") "); 
				stmt.addBatch(sqlInsert.toString());
				stmt.executeBatch();
			}     
			try {
				conn.commit(); 
				bool = true;
			} catch (Exception e1) { 
				e1.printStackTrace();
				conn.rollback();
				bool = false;
			}     

Hibernate用了7秒、batch用了12秒、求解......
2 楼 qq1002517 2012-06-11  
我觉得也是。 batch不可能一点效率不提,不然人家开那方法干什么。
1 楼 xifanlou 2008-10-23  
弱弱的说一句:
那个...第一个是真正的批更新
后两个只是巧妙的执行了五次假更新,而且看样子是插入的重复数据,没有考虑主键么?
另外,再补充一句:
JDBC只是API,真正的批更新是怎么实现的要看数据库厂商,很多数据库没有更改协议,当执行Batch的时候,其实后台还是走的executeUpdate,是假的
真正的批更新是很牛X的,呵呵,直接插入上万组数据,与非批更新不可同日而语

相关推荐

    jdbc批量插入大字段

    因此,"jdbc批量插入大字段"这个话题旨在探讨如何高效地通过Java JDBC来实现Blob字段的批量插入,以提高性能。 首先,我们需要了解JDBC(Java Database Connectivity),它是Java编程语言与各种数据库之间通信的...

    jdbc-批量插入数据

    批量插入数据是数据库操作中常见的一种优化策略,特别是在数据分析、数据迁移或大数据处理等场景。传统的单条插入方式可能会导致大量的网络往返和数据库事务开销,而批量插入则通过一次提交多个SQL语句来减少这些...

    java实现jdbc批量插入数据

    本篇文章将详细介绍如何使用Java实现JDBC批量插入数据,并比较三种常见的JDBC批量插入编程方法。 **方法一:使用PreparedStatement加批量的方法** PreparedStatement是Statement的子接口,允许预编译SQL语句,这...

    oracle数据库中批量插入问题

    2. **使用PL/SQL或外部编程语言(如C#、Java等)**:通过编程接口(如ODBC、JDBC、Oracle Data Provider for .NET等)进行批量插入操作。这种方式更灵活,可以适应更复杂的数据处理需求。 ### C#代码示例解析 提供...

    批量插入大量数据

    批量插入是将多个INSERT语句合并成一个大的INSERT语句,或者通过编程语言提供的API一次性提交多行数据。这样可以减少与数据库服务器之间的交互次数,从而提高性能。例如,在SQL中,你可以使用`INSERT INTO table_...

    dbutils + oracle 增删改查批量插入示例

    通常,批量插入是通过将多条SQL插入语句组合成一个大语句来实现的,dbutils提供了一个便捷的方法来处理这种情况。例如,使用`QueryRunner`的`batch`方法,可以一次性提交多条SQL,减少了网络通信和数据库解析的开销...

    批量插入的simple

    在IT行业中,批量插入(Bulk Insert)是一种优化数据库性能的技术,尤其在处理大量数据时非常有用。本篇文章将深入探讨批量插入的概念、实现方式以及它在实际应用中的优势。 批量插入允许开发者一次性提交多条记录...

    jdbc编程[归纳].pdf

    本文档是关于 JDBC 编程的总结,涵盖了 JDBC 的基础知识、JDBC API 介绍、JDBC 驱动程序的类型、JDBC 连接到 Oracle、JDBC 程序优化、JDBC 分页、JDBC 封装、JDBC 与 Swing 的集成开发等内容。 作为一名软件开发者...

    JDBC与Java数据库编程

    - `Statement`: 用于执行SQL语句,有三种子类:`Statement`、`PreparedStatement`和`CallableStatement`。 - `ResultSet`: 存储查询结果,提供迭代访问方式。 - `DriverManager`: 管理数据库驱动,用于加载和注册...

    JDBCJDBC高级应用

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种接口。在JDBC高级应用中,我们可以利用其提供的功能实现更高效、更灵活的数据操作。以下是一些关键知识点: 1. **元数据获取**...

    JDBC与Java数据库编程.pdf

    ### JDBC与Java数据库编程知识点详解 #### 一、JDBC概念及重要性 **1.1 JDBC简介** JDBC(Java Database Connectivity),即Java数据库连接,是Java平台中用于访问关系型数据库的标准API。它为Java开发人员提供了...

    JDBC编程几乎所有操作的示例源代码

    本压缩包包含了JDBC编程几乎所有的操作示例源代码,这对于初学者和有经验的开发者来说都是宝贵的资源。 首先,我们要了解JDBC的基本操作流程,通常包括以下步骤: 1. **加载驱动**:使用`Class.forName()`方法加载...

    Java语言SQL接口—JDBC编程技术

    对于批量插入或更新,可以使用Statement的addBatch()方法添加SQL语句到批处理队列,然后通过executeBatch()执行。这种方法能显著提高效率,减少与数据库的交互次数。 8. 其他高级特性 - Connection的...

    Java语言SQL接口 JDBC编程技术.rar

    1. **驱动程序**: JDBC驱动程序是Java和数据库之间的桥梁,分为四种类型:Type 1(JDBC-ODBC桥接)、Type 2(部分Java驱动)、Type 3(网络协议驱动)和Type 4(纯Java驱动,也称为Native-API驱动)。 2. **连接...

    jdbc2000,jdbc2005

    Java Database Connectivity(JDBC)是Java编程语言中用于与各种数据库进行交互的一组接口和类。JDBC2000和JDBC2005分别指的是在2000年和2005年时期的JDBC规范版本。这两个版本都是在Java数据库连接技术的发展历程中...

    Java直接用jdbc连接SQLServer要用到的三个扩展库

    例如,你可以使用POI来创建一个`HSSFWorkbook`对象,读取或写入数据,然后将这些数据通过JDBC批量插入到SQL Server数据库中。 使用这三个库的步骤大致如下: 1. 添加库到项目:将`sqljdbc4.jar`,`commons-dbcp....

    批量插入或更新.zip

    在Java编程中,批量插入(Bulk Insert)和更新(Bulk Update)是提高数据库操作效率的重要技术,尤其是在处理大量数据时。这些操作可以显著减少数据库访问次数,从而提升系统性能,节省资源,降低延迟,这对于追求高...

Global site tag (gtag.js) - Google Analytics