知识大全 Spring+Hibernate处理大批量数据

Posted 语句

篇首语:与其降低你的开支,不如去尝试增加你的收入。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring+Hibernate处理大批量数据相关的知识,希望对你有一定的参考价值。

Spring+Hibernate处理大批量数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  对象打包成List

  关于使用Spring+Hibernate进行大批量数据的插入和更新 它的性能和使用JDBC PreparedStatement的batch批量操作以及数据库的存储过程操作几乎可以一样高 在Hibernate的官方文档里说到了Batchprocessing Spring+Hibernate大批量处理数据想要说明如何使用Hibernate大批量处理数据获得高性能

  使用Hibernate将 条记录插入到数据库的一个很自然的做法可能是这样的

  Session session = sessionFactory openSession();

  Transaction tx = session beginTransaction();

  for ( int i= ; i< ; i++ )

  Customer customer = new Customer( );

  session save(customer);

    mit();

  session close();

  这段程序大概运行到 条记录左右会失败并抛出 内存溢出异常(OutOfMemoryException) 这是因为 Hibernate 把所有新插入的 客户(Customer)实例在session级别的缓存区进行了缓存的缘故

  我们会在本章告诉你如何避免此类问题 首先 如果你要执行批量处理并且想要达到一个理想的性能 那么使用JDBC的批量(batching)功能是至关重要 将JDBC的批量抓取数量(batch size)参数设置到一个合适值(比如 之间)

  hibernate jdbc batch_size

  你也可能想在执行批量处理时关闭二级缓存

  hibernate cache use_second_level_cache false

   批量插入(Batch inserts)

  如果要将很多对象持久化 你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小

  Session session = sessionFactory openSession();

  Transaction tx = session beginTransaction();

  for ( int i= ; i< ; i++ )

  Customer customer = new Customer( );

  session save(customer);

  if ( i % == ) // same as the JDBC batch size // 与JDBC批量设置相同

  //flush a batch of inserts and release memory:

  //将本批插入的对象立即写入数据库并释放内存

  session flush();

  session clear();

   

  mit();

  session close();

   批量更新(Batch updates)

  此方法同样适用于检索和更新数据 此外 在进行会返回很多行数据的查询时 你需要使用 scroll() 方法以便充分利用服务器端游标所带来的好处

  Session session = sessionFactory openSession();

  Transaction tx = session beginTransaction();

  ScrollableResults customers = session getNamedQuery( GetCustomers )

   setCacheMode(CacheMode IGNORE)

   scroll(ScrollMode FORWARD_ONLY);

  int count= ;  while ( customers next() )

  Customer customer = (Customer) customers get( );

  customer updateStuff( );

  if ( ++count % == )

  //flush a batch of updates and release memory:

  session flush();

  session clear();

   

  mit();

  session close();

   大批量更新/删除(Bulk update/delete)

  就像已经讨论的那样 自动和透明的 对象/关系 映射(object/relational mapping)关注于管理对象的状态 这就意味着对象的状态存在于内存 因此直接更新或者删除 (使用 SQL语句 UPDATE 和 DELETE)数据库中的数据将不会影响内存中的对象状态和对象数据 不过 Hibernate提供通过Hibernate查询语言(第 章 HQL:Hibernate查询语言)来执行大批量SQL风格的(UPDATE)和(DELETE) 语句的方法

  UPDATE 和 DELETE语句的语法为 (UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)? 有几点说明

  在FROM子句(from clause)中 FROM关键字是可选的

  在FROM子句(from clause)中只能有一个类名 并且它不能有别名

  不能在大批量HQL语句中使用连接(显式或者隐式的都不行) 不过在WHERE子句中可以使用子查询

  整个WHERE子句是可选的

  举个例子 使用Query executeUpdate()方法执行一个HQL UPDATE语句

  Session session = sessionFactory openSession();

  Transaction tx = session beginTransaction();

  String hqlUpdate = update Customer set name = :newName where name = :oldName ;

  int updatedEntities = s createQuery( hqlUpdate )

   setString( newName newName )

   setString( oldName oldName )

   executeUpdate();

  mit();

  session close();

  执行一个HQL DELETE 同样使用 Query executeUpdate() 方法(此方法是为那些熟悉JDBCPreparedStatement executeUpdate() 的人们而设定的)

  Session session = sessionFactory openSession();

  Transaction tx = session beginTransaction();

  String hqlDelete = delete Customer where name = :oldName ;

  int deletedEntities = s createQuery( hqlDelete )

   setString( oldName oldName )

   executeUpdate();

  mit();

  session close();

  由Query executeUpdate()方法返回的整型值表明了受此操作影响的记录数量 注意这个数值可能与数据库中被(最后一条SQL语句)影响了的 行 数有关 也可能没有 一个大批量HQL操作可能导致多条实际的SQL语句被执行 举个例子 对joined subclass映射方式的类进行的此类操作 这个返回值代表了实际被语句影响了的记录数量 在那个joined subclass的例子中 对一个子类的删除实际上可能不仅仅会删除子类映射到的表而且会影响 根 表 还有可能影响与之有继承关系的joined subclass映射方式的子类的表

cha138/Article/program/Java/ky/201311/28366

相关参考

知识大全 Hibernate下数据批量处理解决方案

Hibernate下数据批量处理解决方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多人都

知识大全 hibernate优化方案

  一批量修改和删除  在Hibernate中如果需要对任何数据进行修改和删除操作都需要先执行查询操作在得到要修改或者删除的数据后再对该数据进行相应的操作处理在数据量少的情况下采用这种处理方式没有问题

知识大全 Hibernate的批量处理-批量插入

Hibernate的批量处理-批量插入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiber

知识大全 SPring管理Hibernate事务出现异常处理

SPring管理Hibernate事务出现异常处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Hibernate的批量处理

Hibernate的批量处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hibernate批

知识大全 Hibernate的批量处理[1]

Hibernate的批量处理[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hiberna

知识大全 Hibernate的批量处理[3]

Hibernate的批量处理[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  设置hiber

知识大全 Hibernate的批量处理[2]

Hibernate的批量处理[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  还是用Hibe

知识大全 Hibernate的批量处理[4]

Hibernate的批量处理[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于方法采用传

知识大全 Hibernate的批量处理[5]

Hibernate的批量处理[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Tra