- 浏览: 934697 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (251)
- WebService (17)
- IBatis (22)
- Hibernate (1)
- SpringMVC - 基础篇 (32)
- Spring (15)
- Java (11)
- JVM及调优 - 基础篇 (4)
- 集群 (14)
- 数据库 (17)
- WebSphere (5)
- 多线程 (4)
- 集合、容器 (2)
- DB Pool (1)
- Power Designer (5)
- Maven基础 (5)
- JS (14)
- WEB 前端 (5)
- 实用小工具 (17)
- 社会、人 (2)
- 乱七八糟 (18)
- ASM&CGLIB - 基础篇 (12)
- 缓存 (1)
- 性能 (1)
- 设计之殇 (1)
- 分布式事务 (1)
- 单点登录 (11)
- 分布式 Session (4)
- Memcached - 基础篇 (6)
最新评论
-
一笑_奈何:
楼主写的还真行不错。
扫盲贴 - J2EE集群之JNDI集群实现 -
xuezhongyu01:
博主写的很详细,但最后还是没明白,最后调用BasicDataS ...
Spring中的destroy-method方法 -
Mr梁:
commons-fileupload.jar commons- ...
SpringMVC 中文件上传 MultipartResolver -
Eywa:
总结的很不错
ORACLE CASE WHEN 及 SELECT CASE WHEN的用法 -
TryRelax:
fastjson 比 jackson 好用吧?
Spring MVC Jackson DateFormat
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. 在执行批处理时,方法update和executeBatch的返回值(影响的记录数)不可靠。
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大小介于50到100之间。
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。
二.update和executeBatch返回值
iBatis SqlMap文档提到,批处理执行时,JDBC驱动可以不返回更新的记录数。所以在批处理中,不要依赖update、delete、updateBatch等方法的返回值。
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
评论
executor.executeBatch();
batch = 0;
}
需要修改成 if(batch==500){
executor.executeBatch();
executor.startBatch();
batch = 0;
}
否则批量提交500调之后,后面的记录还是会每条都开一个游标。
批量操作一般是更新或删除操作,它们的返回结果一般是“影响的记录数”,但是“影响的记录数”又是不可靠的,因此不建议返回影响的记录数。
发表评论
-
iBATIS缓存
2011-12-12 21:33 1177为了提高应用程序性 ... -
一个Spring+iBatis框架进行batch处理的问题
2011-09-05 23:23 1629在使用org.springframework.jdbc.dat ... -
ibatis 注意点
2011-08-08 19:28 1389insert,update,delete 返回值 inser ... -
ibatis 之 动态SQL查询(dynamic )
2011-06-12 12:13 2293映射文件: <select id=" ... -
ibatis 之 复杂类型集合的属性
2011-06-12 12:10 2156Result Map还可以装入代表复杂类型对象集合(List) ... -
ibatis 之 复杂类型属性(即自定义类型的属性)
2011-06-12 11:54 3459复杂类型用以表示在数 ... -
ibatis 之 java.util.Map作为parameterClass和resultClass
2011-06-12 11:21 51731.Map作为parameterClass 映射 ... -
ibatis Tips 之 resultMap
2011-05-29 21:04 1219转载:http://xulongfa.iteye.com/bl ... -
ibatis Tips之parameterMap
2011-05-29 21:03 1350转载:http://xulongfa.iteye.com/bl ... -
iBatis查询API
2011-05-29 12:34 1866转载:http://sarin.iteye.com/blog/ ... -
iBatis查询select详解
2011-05-29 12:20 2228转载:http://sarin.iteye.com/blog/ ... -
ibatis 表与表的关联查询
2011-05-22 15:04 1278ibatis高级特性,处理表与表之间的关联。ibatis中,提 ... -
ibatis 动态映射机制
2011-05-22 14:15 1466对于这个组合查询页 ... -
sqlMapConfig.xml配置文件详解
2011-05-22 13:04 3561sqlMapConfig.xml配置文件详解: X ... -
ibatis缓存
2011-05-22 12:52 1373iBatis的缓存配置比较简单易懂,以我使用的iBati ... -
ibatis resultclass "java.util.hashmap" 缓存问题
2011-05-22 12:13 1530在做ibatis项目过程中遇到如下样式动态查询 <se ... -
ibatis # $区别
2011-05-22 11:55 14451、#可以进行预编译,进行类型匹配,#变量名# 会转化为 j ... -
iBATIS入门示例及注释
2011-05-08 18:20 1805工程的结构: 一、SqlMapConf ... -
iBATIS 三个版本小细节对比
2011-05-08 16:12 1212iBATIS 三个版本小细节对比 sqlMapConfig ... -
深入分析 iBATIS 框架之系统架构与映射原理
2011-05-07 12:48 1227原文:http://www.ibm.com/developer ...
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
铅酸电池失效仿真comsol
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
springboot124中药实验管理系统设计与实现,含有完整的源码和报告文档
解除劳动合同协议书
快速过滤图像融合Matlab代码.rar
强调图像中内核形状(例如直线)的过滤器Matlab代码.rar
在内网linux服务器安装redis 在Linux环境中离线安装Redis是常见的需求,尤其是在内网服务器上,由于无法直接访问公网,我们需要提前下载Redis的源码包并手动安装。下面将详细解释如何进行这一过程。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
微信小程序StartKitw_xapp-startkit
座位选择微信小程序版本
机械臂代码_Mechanical_arm
图像分割测试视频river-light.mp4
前端分析-2023071100789
labview源码参考示例,可供参考学习使用
MPC跟踪轨迹圆形(以后轴为基准)
MATLAB代码:基于主从博弈的智能小区代理商定价策略及电动汽车充电管理 关键词:电动汽车 主从博弈 动态定价 智能小区 充放电优化 参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现 仿真平台:MATLAB+CPLEX gurobi平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是一个电动汽车充电管理和智能小区代理商动态定价的问题,将代理商和车主各自追求利益最大化建模为主从博弈,上层以代理商的充电电价作为优化变量,下层以电动汽车的充电策略作为优化变量,通过优化得出最优电价策略以及动态充电策略,代码出图效果非常好,店主已经对代码进行了深入的加工和处理,出图效果非常好,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源,联系后会直接发您资料,保证您学得会,用的起来,简直是萌新福利
springboot154基于Spring Boot智能无人仓库管理,含有完整的源码和报告文档
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作