Hibernate总结(三)--之一级缓存


什么是缓存?

缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可。

缓存需要解决的事情:

1.能把数据放入缓存 2.能把数据从缓存中取出来 3.如果缓存中的数据发生变化,需要把数据同步到数据库中

4.把数据库中的数据同步到缓存中 5.hits命中率低的对象应该及时从缓存中移走

分布式缓存:

为什么会有分布式缓存?

应用程序运行在服务器上,并发访问时,服务器压力过大,分布式缓存就是来分担服务器压力的。

分布式缓存之间的数据是同步的。(比如购物车中的数据都是存在session中)一旦某个服务器挂了,那么操作的数据在其他的服务器的缓存中还可以继续取出来。所以在Tomcat集群的时候,session是先存在了分布式缓存中,在 tomcat 内部集成了memory cache的分布式缓存,就能自动的把 session 同步。

面试,集群时解决 session 问题:就是利用分布式缓存来处理,tomcat可以与memory cache无缝的集成,在tomcat中配置即可。程序员不需要任何干涉。

比较流行的缓存

小型应用:oscache,ehcache

分布式:memory cache,redis,hbase

一、Hibernate的一级缓存

Hibernate的一级缓存,也称为 session 级别的缓存,其生命周期与 session 的生命周期保持一致

一级缓存的位置


持久化状态的对象,就是进入了一级缓存中,换句话说,如果一个对象是一个持久化对象,那么这个对象一定在一级缓存中。

二、Session的操作:

session.get():可以把对象放入到一级缓存中,也可以从一级缓存中把对象提取出来(第一次调用放,以后取)

session.save():可以把一个对象放入到一级缓存中

session.evit():可以把一个对象从缓存中清空

session.update():可以把一个对象放入到一级缓存中

session.clear():清空一级缓存中所有的数据

session.close():一级缓存的生命周期结束


代码测试:

public class SessionCacheTest {
	/**
	 * get方法
	 */
	@Test
	public void testGet(){
		SessionFactory sessionFactory = HibernateUtils.sessionFactory;
		Session session = sessionFactory.openSession();
		Person person = (Person)session.get(Person.class,1L);//发sql,把对象放入到一级缓存中 
		Person person2 = (Person)session.get(Person.class, 1L);//从一级缓存中直接取,不发sql  
		//统计机制
		System.out.println(session.getStatistics().getEntityCount());//统计机制//1,所以get方法把对象放入到缓存  
		session.close();
	}
	
	/**
	 * save方法
	 */
	@Test
	public void testSave(){
		SessionFactory sessionFactory = HibernateUtils.sessionFactory;
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Person person = new Person();
		person.setName("aaa");
		session.save(person);
		System.out.println(session.getStatistics().getEntityCount());//1,所以save方法把对象放入到缓存 
		transaction.commit();
		session.close();
	}
	
	
	
	/**
	 * evict
	 */
	@Test
	public void testEvict1(){
		SessionFactory sessionFactory = HibernateUtils.sessionFactory;
		Session session = sessionFactory.openSession();
		Person person = (Person)session.get(Person.class,1L);
		session.evict(person);	
		System.out.println(session.getStatistics().getEntityCount());//0,evit方法把get放入到缓存中的对象,清空了  
		session.close();
	}
	/**
	 * evict
	 */
	@Test
	public void testEvict2(){
		SessionFactory sessionFactory = HibernateUtils.sessionFactory;
		Session session = sessionFactory.openSession();
		Person person = (Person)session.get(Person.class,1L);
		session.evict(person);
		/** 
		 * 此处注意,evict方法之后,执行update会发送sql,即使对象不做任何修改 
		 * 此处,可以加深session.flush(),进行的对照副本的操作的理解 
		 * 注释掉evict,就不会发送update语句 
		 */  
		session.update(person);
		System.out.println(session.getStatistics().getEntityCount());//1,update方法把对象放入到缓存
		session.close();
	}
	
	/**
	 * clear
	 */
	@Test
	public void testClear(){
		SessionFactory sessionFactory = HibernateUtils.sessionFactory;
		Session session = sessionFactory.openSession();
		Person person = (Person)session.get(Person.class,1L);
		session.clear();
		System.out.println(session.getStatistics().getEntityCount());//0,清空所有  
		session.close();
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值