`
xiaoboss
  • 浏览: 655575 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hibernate 作批量数据操作心得

 
阅读更多

 

程序功能:
使用hibernate+spring将oracle数据库中的tfile表中的数据抽取到db2数据库的tfile表,这两个表的结构相同。(原本要使用一些Spring的特性,但是程序改来改去发现Spring特性一个都没用上,实际上完全可以由hibernate创建两个sessionFactory完成)
测试环境:
celeron M 1.4/512M/mysql 5.0数据库
代码:

 public void save() {

  Session session= fileDAO.getDataSession();
  Session session2= fileDAO2.getDataSession();
  Transaction tx =session2.beginTransaction();
  int count=0;
  List list =fileDAO.getList(session, count);
  while(list.size()!=0)
  {
   for(int i=0,num =list.size();i<num;i++)
   {
    session2.save(list.get(i));
    session.evict(list.get(i));
    if(num%50==0)
    {
     session2.flush();
     session2.clear();
    }
   }
   count= count+500;
   list =fileDAO.getList(session, count);
   
  // System.out.println(count);
   
  }
  tx.commit();
  session.close();
  session2.close();
}

 配置文件:


<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>

 1、为保证不会出现内存溢出
   hibernate.jdbc.batch_size 设为 20-50
   并在代码中没隔50个insert后手工清理数据 
if(num%50==0)

    {
     session2.flush();
     session2.clear();
    }

 2、为保证减少二级缓存导致的过多的内存开销关,闭二级缓存
  hibernate.cache.use_second_level_cache 设为false
3、保证使用长事务,不要在每个插入都事务提交,这样性能可以有很大幅度的提升(由于原先配的事务没有正常运行,在初次测试时此程序插入4万条数据用了12分钟,使用了长事务后仅为34秒)
4、使用ScrollableResults(提供了数据库的游标特性)然后插入的效果好像要优于分批抓取分批插入的效果,(4万条数据,用ScrollableResult耗时29秒)但网上有人声称批量抓取插入的效果要好可能在远程数据库的情况下批量抓取的可靠性更高一点的原因。这一点我询问过公司里做数据库比较好的人,批量处理数据是要使用游标处理的。就游标而言分为动态游标,静态游标,动态游标慢于静态游标,静态游标慢于静态查询,但是如果用分批抓取数据的话就涉及到数据分段截取,为保证每次分段截取时数据的正确性,应该要预先对数据处理,所以批量抽取数据的速度可能会慢一些。以下为使用ScrollableResult的程序
Session session= fileDAO.getDataSession();

  Session session2= fileDAO2.getDataSession();
  Transaction tx =session2.beginTransaction();
  ScrollableResults tFiles = session.createQuery(
    "from TFile as model ").setCacheMode(CacheMode.IGNORE).scroll(ScrollMode.FORWARD_ONLY);
  int count=0;
  while(tFiles.next())
  {
   session2.save(tFiles.get(0));
   if(++count%50==0)
    {
     session2.flush();
     session2.clear();
    }
  }
  tx.commit();
  session.close();
 

 

分享到:
评论

相关推荐

    Hibernate插入数据

    本篇将详细探讨“Hibernate插入数据”的相关知识点,结合学习心得,深入理解并掌握其核心原理与实践技巧。 首先,Hibernate通过对象关系映射(ORM)技术,将数据库表与Java类关联起来,使得数据库操作可以通过对象...

    hibernate心得

    在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,让开发者可以更加专注于业务逻辑,而不是底层的数据访问。本心得旨在分享对Hibernate深入理解的关键点,希望对你在使用...

    Hibernate开发手册

    - **技术博客**:许多知名博主分享了他们在使用 Hibernate 过程中的心得与经验。 通过上述内容的学习与实践,读者可以逐步成长为 Hibernate 高手,并能够运用 Hibernate 技术解决实际项目中的问题。

    Springside之开发bookstore心得

    - **订单管理**:包括订单查看、发货等操作,并且在发货时记录业务日志,异步地批量写入数据库(使用Log4j)。 - **库存预警**:借助Quartz调度器,在工作时间每隔一段时间检查低库存图书,若发现低库存情况,则通过...

    Java开发:J2EE OA 项目开发日记

    在OA系统中,消息队列可以用来异步处理任务,如批量数据处理或通知服务,提高了系统的响应速度和可扩展性。 5. **JNDI与目录服务** JNDI提供了一个统一的接口,用于查找和绑定服务,如数据库连接池、邮件服务器...

    JavaWeb课程设计实验报告 (2).pdf

    框架如Spring Boot简化开发流程,MyBatis或Hibernate负责数据库操作。 2. 数据库设计:MySQL等关系型数据库用于存储用户信息、商品信息、订单数据等。表结构设计应遵循规范化原则,确保数据一致性。 3. 界面设计:...

    SSH电影后台管理系统实验报告 期末作业.doc

    SSH电影后台管理系统是一个基于Web的综合平台,用于...通过SSH框架的运用,实现了数据的高效管理,并提供了用户友好的操作界面。这个系统不仅提升了电影管理的效率,也为用户提供了一个方便快捷的电影信息获取途径。

    spring学习笔记0.0.0

    9. **Spring Batch**:用于处理批量数据操作。 10. **测试支持**:Spring提供了测试框架,包括单元测试、集成测试工具,便于进行高质量的软件开发。 这本笔记可能会按照以上这些主题进行深入探讨,同时结合作者的...

    基于SSH的网上化妆品购物系统设计与实现毕业设计论文.doc

    Struts2负责视图层,Spring处理业务逻辑,Hibernate进行数据持久化,保证了各模块间的解耦合和高效运行。 3.2 系统架构 采用MVC(Model-View-Controller)模式设计,将业务逻辑、数据模型和用户界面分离,使得系统...

Global site tag (gtag.js) - Google Analytics