hibernate缓存机制

一级缓存(session缓存)
   1、生命周期就是session的生命周期
   2、一级缓存存放的数据都是私有数据
        把session存放在threadlocal中,不同的线程是不能访问的,所以保证了数据的安全性
   3、怎么样把数据存放到一级缓存中
        利用session.save/update/load/get方法都可以存放在一级缓存中
   4、利用session.get/load方法可以把数据从一级缓存中取出
   5、session.evict方法可以把一个对象从一级缓存中清空
   6、利用session.clear方法可以把session中的所有的数据清空
   7、利用session.Refresh方法把数据库中的数据同步到缓存中
   8、session.flush
        在session的缓存内部,会去检查所有的持久化对象
           1、如果一个持久化对象没有ID值,则会发出insert语句
           2、如果一个持久化对象有ID值,则会去检查快照进行对比,如果一样,则什么都不做,如果不一样,则发出update语句
           3、检查所有的持久化对象是否有关联对象
                检查关联对象的级联操作
                检查关联对象的关系操作
   9、批量操作


java代码示例

	/**
	 * session.get方法把数据存放在一级缓存中
	 */
	
	/**
	 * session.load方法把数据存放在一级缓存中
	 */
	
	/**
	 * session.save方法把数据保存在一级缓存中
	 */
	
	/**
	 * session.update方法把数据保存在一级缓存中
	 */
	@Test
	public void testUpdate(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		session.evict(classes);//classes对象从session中清空了
		session.update(classes);//把classes对象放入到了session缓存中
		classes = (Classes)session.get(Classes.class, 1L);
		transaction.commit();
	}
	
	/**
	 * session.clear
	 */
	@Test
	public void testClear(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		session.clear();//classes对象从session中清空了
		classes = (Classes)session.get(Classes.class, 1L);
		transaction.commit();
	}
	
	@Test
	public void testClearTest(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes  = (Classes)session.get(Classes.class, 1L);
		session.clear();//如果不加这句话,两个不同的对象,相同的ID值,所以得把其中的一个清空
		Classes classes2 = new Classes();
		classes2.setCid(1L);
		classes2.setCname("asfd");
		session.update(classes2);
		transaction.commit();
	}
	
	/**
	 * 把数据库中的数据刷新到缓存中
	 */
	@Test
	public void testRefresh(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		classes.setCname("66");
		session.refresh(classes);//把cid为1的值从数据库刷到了缓存中
		System.out.println(classes.getCname());
		transaction.commit();
	}
	
	/**
	 * session.flush
	 */
	@Test
	public void testFlush(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes  =(Classes)session.get(Classes.class, 1L);
		classes.setCname("afdsasdf");
		Set students = classes.getStudents();
		for(Student student:students){
			student.setDescription("asdf");
		}
		session.flush();
		transaction.commit();
	}
	/**
	 *向数据库中插入一百万条数据
	 */
	@Test
	public void testSaveBatch(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		for(int i=6;i<1000000;i++){
			Classes classes = new Classes();
			classes.setCname("aaa");
			classes.setDescription("afds");
			session.save(classes);
			//若不使用此判断则会产生内存溢出,
			//因为session.save()操作会将对象持久化存在内存中
			if(i%50==0){
				session.flush();
				session.clear();
			}
		}
		transaction.commit();
	}
	
	/**
	 * session.flush只是发出SQL语句了,并没有清空session缓存
	 */
	@Test
	public void testFlush2(){
		Session session = sessionFactory.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		Classes classes = (Classes)session.get(Classes.class, 1L);
		session.flush();
		classes = (Classes)session.get(Classes.class, 1L);
		transaction.commit();
	}

二级缓存:

二级缓存:存放公有数据
   1、适用场合:
        1、数据不能频繁更新
        2、数据能公开,私密性不是很强
   2、hibernate本身并没有提供二级缓存的解决方案
   3、二级缓存的实现是依赖于第三方供应商完成的
         ehcache
         oscache
         jbosscache
         swamchache
   4、二级缓存的操作
         1、二级缓存存在sessionFactory中
         2、生命周期:与sessionFactory保持一致
     

   3、使用二级缓存的步骤
             1、在hibernate.cfg.xml
                  true
                  
                        org.hibernate.cache.EhCacheProvider
                  
             2、让某一个对象进入到二级缓存中
                 * 在hibernate.cfg.xml中配置
                   
                 *  在映射文件中
                    
             3、使用
                  session.get/session.load



查询缓存:

查询缓存是基于二级缓存的额,我们必须先将二级缓存配置好

在hibernate.cfg.xml中填入如下配置

true

hibernate缓存机制_第1张图片

你可能感兴趣的:(hibernate,hibernate,hibernate缓存机制,缓存机制)