批量处理数据是指处理大量数据的一个单独的事务.

在应用层批处理操作, 主要有以下方式:

  • 通过 Session
  • 通过 HQL
  • 通过 StatelessSession
  • 通过 JDBC API(仅仅要会用这样的,其它作为了解)
通过 Session 来进行批量操作
Session 的 save() 及 update() 方法都会把处理的对象存放在自己的缓存中. 假设通过一个 Session 对象来处理大量持久化对象, 应该及时从缓存中清空已经处理完成而且不会再訪问的对象. 详细的做法是在处理完一个对象或小批量对象后, 马上调用 flush() 方法刷新缓存, 然后在调用 clear() 方法清空缓存



通过 Session 来进行处理操作会受到下面约束
  • 须要在 Hibernate 配置文件里设置 JDBC 单次批量处理的数目, 应保证每次向数据库发送的批量的 SQL 语句数目与 batch_size 属性一致
  • 若对象採用 “identity” 标识符生成器, 则 Hibernate 无法在 JDBC 层进行批量插入操作
  • 进行批量操作时, 建议关闭 Hibernate 的二级缓存
  • 批量更新: 在进行批量更新时, 假设一下子把全部对象都载入到 Session 缓存, 然后在缓存中一一更新, 显然是不可取的
使用可滚动的结果集 org.hibernate.ScrollableResults, 该对象中实际上并不包括不论什么对象, 仅仅包括用于在线定位记录的游标. 仅仅有当程序遍历訪问 ScrollableResults 对象的特定元素时, 它才会到数据库中载入对应的对象.


org.hibernate.ScrollableResults 对象由 Query 的 scroll 方法返回




通过 HQL 来进行批量操作
注意: HQL 仅仅支持 INSERT INTO … SELECT 形式的插入语句, 但不支持 INSERT INTO … VALUES 形式的插入语句. 所以使用 HQL 不能进行批量插入操作.




通过StatelessSession来进行批量操作
从形式上看。StatelessSession与session的使用方法类似。StatelessSession与session相比,有下面差别:

  • StatelessSession没有缓存。通过StatelessSession来载入、保存或更新后的对象处于游离状态。
  • StatelessSession不会与Hibernate的第二级缓存交互。
  • 当调用StatelessSession的save()、update()或delete()方法时,这些方法会马上运行对应的SQL语句,而不会仅计划运行一条SQL语句
  • StatelessSession不会进行脏检查,因此改动了Customer对象属性后。还须要调用StatelessSession的update()方法来更新数据库中数据。
  • StatelessSession不会对关联的对象进行不论什么级联操作。
  • 通过同一个StatelessSession对象两次载入OID为1的Customer对象。得到的两个对象内存地址不同。
  • StatelessSession所做的操作能够被Interceptor拦截器捕获到,可是会被Hibernate的事件处理系统忽略掉。
public class HibernateTest {

	private SessionFactory sessionFactory;
private Session session;
private Transaction transaction; @Before
public void init(){
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry =
new ServiceRegistryBuilder().applySettings(configuration.getProperties())
.buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry); session = sessionFactory.openSession();
transaction = session.beginTransaction();
} @After
public void destroy(){
transaction.commit();
session.close();
sessionFactory.close();
} @Test
public void testBatch(){
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
//通过 JDBC 本机 API 操作, 效率最高, 最快!
}
});
} }


hibernate 批量处理数据的更多相关文章

  1. Hibernate 批量update数据时,怎么样做可以回滚,

    Hibernate 批量update数据时,怎么样做可以回滚, 1.serviceManagerDaoImpl代码里对异常不进行try,catch抛出, 2.或者抛出throw new Runtime ...

  2. Hibernate批量处理数据

    01.批量插入数据 步骤一.创建实体类,Dept和Emp /** * 员工类 * @author Administrator * */ public class Emp { private Integ ...

  3. Hibernate批量处理数据、HQL连接查询

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 ...

  4. Hibernate批量处理数据、[HQL连接查询]

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...

  5. hibernate 批量插入数据

    如题,有两种方法 1)使用FLUSH 2)使用JDBC 分别来解释: 1)hibernate在进行数据库操作的时候,都要有事务支持的.可能你曾遇到过,没有加事务,程序会报错的情况. 而事务每次提交的时 ...

  6. Hibernate 批量保存数据

    public Boolean save(Collection<Object> os) { int batchSize = 50,i=0; Session session=this.sess ...

  7. hibernate批量删除和更新数据

    转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...

  8. hibernate批量更新和删除数据

    批量处理  不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过,听说 ...

  9. Hibernate三种批量处理数据

    概念:批量处理数据是指在一个事务场景中处理大量数据. 在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作  数据库层面  execute ...

随机推荐

  1. HDU 4707 Pet(DFS(深度优先搜索)+BFS(广度优先搜索))

    Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  2. C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

    在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc ...

  3. HDU 4981 Goffi and Median(水)

    HDU 4981 Goffi and Median 思路:排序就能够得到中间数.然后总和和中间数*n比較一下就可以 代码: #include <cstdio> #include <c ...

  4. 按 Eclipse 开发喜好重新布置 cocos2dx 目录层次

    [tonyfield 2013.08.29 ] 1.  Cocos2dx 库的改动 处于个人的固执,花一天时间重新布置了cocos2dx 2.1.4的目录层次,将android平台无关的代码全数裁剪, ...

  5. PHP+lghttpd + postgresql 环境搭建

    PHP+lghttpd + postgresql 环境搭建 Linux 下PHP环境搭建 安装环境:PHP+lghttpd + postgresql 1:yum install lighttpd 红旗 ...

  6. BAD packet signature 18245 错误解决

    1.错误信息 2014-7-15 2:46:38 org.apache.jk.common.MsgAjp processHeader 严重: BAD packet signature 18245 20 ...

  7. openwrt 3g模块上网

    硬件环境:     开发板为RT5053F        3G模块为中兴 MC2176 电信版 以下是操作步骤 加入VID .PID VID . PID 的获取方法是 将设备插入电脑在linux下执行 ...

  8. Memcahce(MC)系列(一)Memcache介绍、使用、存储、算法、优化

    写在前面:前不久在工作中被问到关于MC一致哈希的问题,由于时隔太久差点儿忘记,特前来恶补一下MC,下面是前几年在工作中学习MC时的一些资料,来历不明,特整理一下,希望对大家的学习也能有帮助. 32 的 ...

  9. Android UI布局TableLayout

    了解字面上TableLayout一个表格样式布局.这种布局将包括以行和列的形式的元件被布置.表格列的数目是列的各行中的最大数目.当然,表格里面的单元格它能够清空. 实例:LayoutDemo 执行效果 ...

  10. 鸟哥之安裝 CentOS7.x

    http://linux.vbird.org/linux_basic/0157installcentos7.php since 2002/01/01 新手建議 開始閱讀之前 網站導覽 Linux 基礎 ...