jdbc批量更新_用集算器更新数据库的技巧

对数据库进行批量更新时,使用update函数要比execute函数性能更好。

比如,source和target是两个不同的数据源,callrecordA是source中的物理表,有1万条记录,callrecordB是target中的物理表,无记录,现在需要将callrecordA中的数据同步到callrecordB中。

当使用execute函数进行批量更新,可以发现性能不够理想,代码如下:

44e3452225f65c92fd34baa0c22915a2.png

上述算法实际是循环执行insert语句,并没有充分利用JDBC的批量更新机制,因此性能较差。而且上述算法只是插入数据,如果既有插入又有修改,处理起来会麻烦许多。

使用update函数后,可以看到性能提升明显,代码如下:

a7ef58e929c8dbebc20bae25c0af6a0d.png

函数update利用JDBC的executeBatch机制进行批量更新,因此性能较好。选项@i表示只需生成insert语句,@u表示只生成update语句。无选项时表示既有insert又有update,即目标表已有数据,需比对源表和目标表的主键,如果某主键在源表存在,在目标表不存在,则生成insert语句,如果某主键在源表和目标表都存在,则生成update语句。

数据库通常会提供同步/导入工具,这些工具通常具备更好的性能,也都支持命令行调用。SPL可执行命令行,因此可以调用这些工具。比如用oracle的sqlldr导入数据,可使用如下代码:

b65034f19b8c327e0ee785f2f03a6215.png

A1-A3:将source中的表导出成文本文件,分隔符为|。文本文件如果已存在,则可省略本步骤。

A4:执行命令行,调用sqlldr,命令格式要符合sqlldr的官方要求。注意callrecordB.ctl 是sqlldr要求的控制文件,格式如下:

5730d7357a7ac54c2fb32c11dba2760d.png

SPL支持并行计算,包括并行执行同步/导入工具,所以可以将单文本拆成多个文本,同时导入多个文件,以此获得更高性能。不同的同步/导入工具,有不同的并行要求,通常的要求是不锁表,且无唯一索引。比如并行执行sqlldr,可用如下代码:

36b7fec67a24805eed54331ae159bede.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值