`

iBatis批处理(batch)

 
阅读更多

spring集成了ibatis的批量提交的功能,我们只要调用API就可以了
首先在你的dao中需要继承org.springframework.orm.ibatis.support.SqlMapClientDaoSupport
然后在代码中调用getSqlMapClientTemplate方法, 覆写SqlMapClientCallback类中的doInSqlMapClient的方法

public void insertTreeCateBatch(final List<Customer> customerList) throws DataAccessException{ 
    this.getSqlMapClientTemplate().execute(new SqlMapClientCallback(){ 
    public Object doInSqlMapClient(SqlMapExecutor executor) 
            throws SQLException { 
    executor.startBatch(); 
    int batch = 0; 
    for(Customercustomer:customerList){ 
        executor.insert("Customer.insertCustomer", TreeCate); 
        batch++; 
        //每500条批量提交一次。 
        if(batch==500){ 
            executor.executeBatch(); 
             batch = 0; 
        } 
       } 
     executor.executeBatch(); 
     return null; 
     } 
    }); 
} 

 

 

-------------------------------------------------------------------------------------------

转载:http://san-yun.iteye.com/blog/900949

本文重点:

1.  在执行批处理时,方法updateexecuteBatch的返回值(影响的记录数)不可靠。

2.  批处理必须在显式的事务中进行,并且关闭auto commit

3.  Batch大小。

 

一.JDBC批处理

CRUD一样,iBatis通过JDBC支持,封装实现了自己的批处理。下面是一段使用JDBC进行批处理的代码:

Connection conn = ...;

conn.setAutoCommit(false);

 

PreparedStatement ps = conn.prepareStatement("insert into tb (id) values (?)");

for (int i = 0; i < 1000; i++) {

    ps.setInt(1, i);

    ps.addBatch();

}

ps.executeBatch();

conn.commit();

 

ps.close(); // Move this line into a finally block.

conn.close();

 

JDBC 3.0规范提到, JDBC驱动会在调用PreparedStatement#executeBatch时做commit。需要小心的是批处理失败的情况:如果关闭auto commit,当发生错误时,可以调用rollback进行回滚,也可以调用commit提交成功执行的那部分修改;但如果打开auto commit,如何处理由实现(驱动)决定。因此,在执行批处理时,应当总是关闭auto commit

 

Oracle 9i特性中,给出了一些最佳实践,包括:

1.  在执行批处理时,总是关闭auto commit

2.  Batch的大小应保持在10左右;

 

Oracle后续的版本(10g/11g),也要求关闭auto commit。但是,在11g中,推荐的batch大小介于50100之间。

Oracle recommends you to keep the batch sizes in the general range of 50 to 100. This is because though the drivers support larger batches, they in turn result in a large memory footprint with no corresponding increase in performance. Very large batches usually result in a decline in performance compared to smaller batches.

Oracle在批处理上还有些其它限制,具体可以参考文后的链接。我们可能不需要关注这样的细节,最好咨询DBA

 

二.updateexecuteBatch返回值

iBatis SqlMap文档提到,批处理执行时,JDBC驱动可以不返回更新的记录数。所以在批处理中,不要依赖updatedeleteupdateBatch等方法的返回值。

Note that it is entirely legal for the JDBC driver to fail to return the number of records updated in a batch - in which case the executeBatch() method will return 0 even though records have been updated. The Oracle driver is a good example of a driver that behaves this way.

但是,如果一条insert语句的sqlMap定义了selectKey语句,批处理中的insert仍然会正确返回主键值,因为SelectKeyStatement是在批处理外进行的。请参考SqlMapExecutorDelegate#insert

 

三.batch与事务

批处理必须总是包裹在一个显式的事务中,否则iBatis会无视batch,逐条执行。请参考SqlMapExecutorDelegate#insert

A batch should ALWAYS be nested inside an explicit transaction. If you fail to use an explicit transaction, then iBATIS will execute each statement individually as if you had never started a batch.

在使用到批处理时,我们通常在DAO这样写:

getSqlMapClientTemplate().execute(new SqlMapClientCallback() {

 

    public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {

        executor.startBatch();

        for (QuotationItemTemplateDO template : quotationItemTemplates) {

            executor.insert("MS-CREATE-QUOT-ITEM-TEMPLATE", template);

        }

        executor.executeBatch();

        return null;

    }

});

SqlMapClientTemplate会自动包裹一个UserProvidedTransaction,不过遗憾的是,这个事务不会关闭auto commit。所以我们还是需要在Biz层包裹一个Spring管理的事务。请参考DataSourceTransactionManager#doBegin,这个方法关闭了auto commit

 

四.参考

²  JDBC 3.0 Spec: http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdbc-3_0-fr-spec.pdf?BundledLineItemUUID=TBGJ_hCujZcAAAEpc8FCxpJr&OrderID=ugmJ_hCukvUAAAEpZcFCxpJr&ProductID=eKnACUFBKakAAAEYLrU5AXiq&FileName=/jdbc-3_0-fr-spec.pdf

²  Oracle 9i Feature:

http://www.oracle.com/technology/products/oracle9i/daily/jun07.html

²  Oracle 10g – Performance Extensions:

http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oraperf.htm#i1059053

²  Oracle 11g – Performance Extensions:

http://download.oracle.com/docs/cd/E11882_01/java.112/e10589/oraperf.htm#i1056232

²  iBatis SqlMap Document:

http://svn.apache.org/repos/asf/ibatis/java/ibatis-2/trunk/ibatis-2-docs/en/iBATIS-SqlMaps-2_en.pdf

分享到:
评论
3 楼 爱像天空 2014-12-12  
经测试,if(batch==500){  
            executor.executeBatch();  
             batch = 0;  
        }
需要修改成  if(batch==500){  
            executor.executeBatch();  
            executor.startBatch();  
             batch = 0;  
            }
否则批量提交500调之后,后面的记录还是会每条都开一个游标。
2 楼 温柔的羊 2012-11-02  
truddy 写道
怎么可以返回处理结果 ?

批量操作一般是更新或删除操作,它们的返回结果一般是“影响的记录数”,但是“影响的记录数”又是不可靠的,因此不建议返回影响的记录数。
1 楼 truddy 2012-11-02  
怎么可以返回处理结果 ?

相关推荐

    ibatis 完美例子 一对多 批处理 事务 和 spring struts2集成

    在Ibatis中,可以通过设置SqlSession的flushCache和useCache属性,以及使用批处理执行器ExecutorType.BATCH,来实现批量插入、更新或删除。例如,在插入1万条数据时,将这些操作放在同一个SqlSession中,而不是逐一...

    SpringBatch批处理 刘相编

    基本篇重点讲述了数据批处理的核心概念、典型的作业配置、作业步配置,以及Spring Batch框架中经典的三步走策略:数据读、数据处理和数据写,详尽地介绍了如何对CVS格式文件、JSON格式文件、XML文件、数据库和JMS...

    ibatis应对批量update

    executor.update("test.batchUpdate", item); } executor.executeBatch(); return null; } } ); } } catch (Exception e) { // 处理异常 } ``` 5. **注意事项**: - 确保数据库驱动支持批量更新功能。 -...

    ibatis批量存储

    使用Ibatis的批处理,首先需要开启SqlSession的自动提交,然后调用SqlSession的batch()方法进入批处理模式,接着执行多次insert、update或delete操作,最后调用commit()方法提交事务。这种方式避免了频繁的数据库...

    ibatis api 英文文档

    11. **Batch Operations**:iBATIS提供了批处理功能,可以一次性提交多个插入、更新或删除操作,提升批量数据处理的效率。 12. **Error Handling**:当SQL执行出错时,iBATIS会抛出异常,提供错误信息帮助定位问题...

    ibatis案例

    同时,批处理(batch)操作也是优化性能的重要手段。 通过这个"Ibatis案例",你可以学习到如何配置和使用Ibatis,掌握数据库操作的核心技能,并了解如何将其融入到实际的项目开发中。实践是最好的老师,动手尝试并...

    ibatis

    - iBatis 提供了两种执行器(Executor)模式:Simple Executor 和 Batch Executor,分别用于单个语句的执行和批处理。 7. **插件支持** - iBatis 允许自定义插件,可以拦截 SQL 执行过程中的各个步骤,进行额外的...

    axis1.4+ibatis2.3开发webservice服务[图解]

    - **服务部署脚本**:编写一个`deploy.bat`批处理文件,用于生成`server-config.wsdd`文件,这个文件包含了服务的具体配置信息。例如: ```batch set Axis_Lib=F:\jakarta-tomcat-5.0.28\webapps\bbinterface\WEB...

    ibatis的批量插入DAO实例

    可以在MyBatis的配置文件中调整`defaultExecutorType`为`BATCH`,以启用批处理模式,这样所有的SQL语句会在一次数据库事务中执行,大大提高性能。 总结来说,Ibatis批量插入的DAO实例主要依赖于动态SQL的`&lt;foreach&gt;...

    ibatis n+1选择问题 的几种解决方案

    1. **批处理(Batch)查询**: 批处理查询允许我们一次性发送多个SQL语句到数据库,减少数据库连接次数。在iBATIS中,可以通过设置动态SQL来实现。例如,对于一个`User`对象,如果它有一个`Address`列表,可以使用`...

    IBatis框架

    - **批处理**:使用 `SqlSession` 的 batch() 方法,批量执行相似的插入或更新操作。 - **缓存**:MyBatis 支持一级和二级缓存,提高数据读取速度。 ### 9. MyBatis 与 Spring 集成 - **Spring 注解**:使用 `@...

    ibatis解决多对一n+1问题(更新上传例子(mybatis)代码)

    6. **批处理(Batch)**:对于大量数据的操作,可以使用MyBatis的批处理功能,减少数据库交互次数。 在提供的"mybatis_test"压缩包中,可能包含了示例代码,展示了如何在MyBatis中使用上述策略来解决“n+1”问题。...

    Ibits与MySql的结合

    6. 性能优化:结合使用MyBatis和MySQL,可以通过预编译SQL(PreparedStatement)、批处理(Batch)等方式提升性能。同时,对数据库索引的合理设计和SQL查询的优化也是必不可少的。 总之,Ibatis与MySQL的结合为Java...

    基于java的DataBuffer在Java中使用ADO.NET.zip

    - 当处理大量数据时,考虑使用批处理(batch processing)以提高性能。 - 使用事务管理确保数据的一致性。 - 选择适合项目需求的ORM框架,考虑其性能、学习曲线和社区支持。 7. **代码示例** 假设我们使用JDBC...

    Spring Framework 2.0开发参考手册(中文版chm)

    除此之外,Spring还包含其他模块,如Spring Batch用于批量处理任务,Spring Integration用于企业集成,Spring Security提供认证和授权功能,Spring AMQP支持消息队列,以及Spring Boot简化微服务开发等。所有这些...

    spring面试题.doc

    - Hibernate中`hibernate.jdbc.fetch.size`和`hibernate.jdbc.batch_size`的作用:前者控制每次查询的结果集大小,后者用于批处理,设置SQL语句批量执行的大小。 5. **Spring的JdbcTemplate**:这是一个简化JDBC...

    Spring jar包

    除了以上这些核心jar包,Spring还有其他针对特定需求的模块,如Spring Security(安全)、Spring Batch(批处理)、Spring Integration(企业集成)和Spring Boot(快速启动微服务)等。这些jar包可以按需引入,以...

    spring in action 2.0

    6. **Spring Batch**:这是一个用于处理批量操作的模块,2.0版本加强了对复杂批处理任务的管理和监控。它支持事务管理、错误处理和重复数据处理,使得批量数据处理变得高效且可靠。 7. **portlet支持**:Spring 2.0...

Global site tag (gtag.js) - Google Analytics