zoukankan      html  css  js  c++  java
  • hibernate 批量处理数据

    批量处理数据是指在一个事务中处理大量数据.

    在应用层进行批量操作, 主要有下面方式:

    • 通过 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 进行操作, 效率最高, 速度最快!
    			}
    		});
    	}
    
    }







  • 相关阅读:
    PHP学习笔记(二)
    PHP开发笔记(一)
    PHP NOTE
    python windows进制文件可以直接下载使用
    深入浅出Hyper-V网络虚拟化技术
    深入浅出Hyper-V网络虚拟化(序)
    Windows Server 笔记(七):Windows Server 2012 R2 NIC Teaming(NIC组)
    Hyper-v Server 2012 R2增强会话模式
    Hyper-V动态迁移中?小心性能损失
    CLOUDSTACK FOR HYPER-V
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/3809060.html
Copyright © 2011-2022 走看看