hibernate 一级缓存

一级缓存

为什么要用缓存?

目的:减少对数据库的访问次数!从而提升hibernate的执行效率!

Hibernate中缓存分类:

一级缓存

二级缓存

概念

1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效!

2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。

3)Session的缓存由hibernate维护,用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。

特点:

         只在(当前)session范围有效,作用时间短,效果不是特别明显!

         在短时间内多次操作数据库,效果比较明显!

缓存相关几个方法的作用

session.flush();       让一级缓存与数据库同步

session.evict(arg0);    清空一级缓存中指定的对象

session.clear();       清空一级缓存中缓存的所有对象

在什么情况用上面方法?

批量操作使用使用:

Session.flush();   // 先与数据库同步

Session.clear();   // 再清空一级缓存内容

面试题1: 不同的session是否会共享缓存数据?

不会。

User1  u1 = Session1.get(User.class,1);   把u1对象放入session1的缓存

Session2.update(u1);     把u1放入session2的缓存

U1.setName(‘newName’);

如果生成2条update sql, 说明不同的session使用不同的缓存区,不能共享。

面试题2: list与iterator查询的区别?

list()

一次把所有的记录都查询出来,

会放入缓存,但不会从缓存中获取数据

Iterator

N+1查询; N表示所有的记录总数

即会先发送一条语句查询所有记录的主键(1),

再根据每一个主键再去数据库查询(N)!

会放入缓存,也会从缓存中取数据!

测试一级缓存:

JavaBean User:

<span style="font-family:Courier New;font-size:14px;">package cn.itcast.cache;

public class User {
	private int userId;
	private String userName;
	public int getUserId() {
		return userId;
	}
	public void setUserId(int useId) {
		this.userId = useId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	@Override
	public String toString() {
		return "User [useId=" + userId + ", userName=" + userName + "]";
	}

}
</span>

Uer.hbm.xml文件

<span style="font-family:Courier New;font-size:14px;"><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.cache" auto-import="true">
	<class name="User" table="t_user">
		<id name="userId">
			<generator class="native"></generator>
		</id>
		<property name="userName"  column="userName"></property>
	</class>
</hibernate-mapping></span>

1.数据库中保存数据:

<span style="font-family:Courier New;font-size:14px;">@Test
	public void test(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		User user =new User();
		user.setUserName("翁宗顺");
		session.save(user);
		transaction.commit();
		session.close();
	}</span>

2.数据库中多次查询数据

<span style="font-family:Courier New;font-size:14px;">@Test
	public void testGet(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		User user=null;
		user=(User) session.get(User.class, 1);//第一才会从一级缓存中查找数据,如果没有就从数据库查找
//		session.evict(user);//清除缓存中指定的数据
		user=(User) session.get(User.class, 1);//因为一级缓存中已经有了数据,所以直接从一级缓存中 查找数据即可
		transaction.commit();
		session.close();
	}</span>

测试发现如果两次查询数据一样,那么第一次会把数据放到一级缓存中,第二次查询的时候直接从缓存中取出数据.这样就极大的提高了效率.可以发现控制台只打印一条sql数据.

如果使用session.evict(user):清除缓存中指定的对象 session.clear()清除缓存中所有的数据.第一次会从数据库中查询 第二次查询的时候会从缓存中找数据,但是缓存已经被清空 因此就会从数据库中查找数据.可以发现控制台打印两条sql语句

3.测试缓存是否可以跨session获取

<span style="font-family:Courier New;font-size:14px;">@Test
	public void testUpdate(){
		Session session1 = HibernateUtil.getSession();
		Transaction transaction1 = session1.beginTransaction();
		Session session2 = HibernateUtil.getSession();
		Transaction transaction2 = session2.beginTransaction();
		User user=null;
		user=(User) session1.get(User.class, 1);
		//这说明只是在自己的session范围内有效
		user=(User) session2.get(User.class, 1);
		transaction1.commit();
		session1.close();
		transaction2.commit();
		session2.close();
	}</span>

测试发现:控制台打印两条sql语句 这说明 只在(当前)session范围有效,作用时间短,效果不是特别明显!

4.测试集合数据中的缓存

list遍历

//测试list:一次性把 所有的记录都查询出来
	@Test
	public void testList(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		List<User> list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}

		transaction.commit();
		session.close();
	}

测试:控制台打印一条sql语句,即一次性查询出所有的数据

iterate遍历

/测试iterate:它是N+1方式的查询
	// 即先发送一条语句查询所有记录的主键
	//然后根据每一个主键再去数据库中查询(N)
	@Test
	public void testIterate(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		Iterator it = q.iterate();
		while(it.hasNext()){
			User u=(User) it.next();
			System.out.println(u.getUserName());
		}
		transaction.commit();
		session.close();
	}

测试:先发送一条语句查询所有记录的主键,然后根据每个主键去数据库中查询

iterate缓存

@Test
	public void  cacheIterate(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		Iterator it = q.iterate();
		while(it.hasNext()){
			User u=(User) it.next();
			System.out.println(u.getUserName());
		}
		System.out.println("============");
		 it = q.iterate();
		while(it.hasNext()){
			User u=(User) it.next();
			System.out.println(u.getUserName());
		}
		transaction.commit();
		session.close();
	}
	@Test
	public void  cacheList(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		List<User> list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}
		System.out.println("==============");
		list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}

		transaction.commit();
		session.close();
	}

测试:iterate会把数据保存到一级缓存,也可以从一级缓存中获取数据

list缓存 :

@Test
	public void  cacheList(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		List<User> list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}
		System.out.println("==============");
		list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}

		transaction.commit();
		session.close();
	}

测试 :通过测试我们不能判断list遍历的方式是否把数据放到了一级缓存中,也不能判断能否从一级缓存中取出数据

先使用list 再使用iterate

@Test
	public void  cacheList2(){
		Session session = HibernateUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Query q = session.createQuery("from User");
		List<User> list = q.list();
		for(User u:list){
			System.out.println(u.getUserName());
		}
		System.out.println("==============");
		Iterator it = q.iterate();
		while(it.hasNext()){
			User u=(User) it.next();
			System.out.println(u.getUserName());
		}

		transaction.commit();
		session.close();
	}

测试:list遍历可以把数据保存到一级缓存中,但是不能从一级缓存中取出数据

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-11 07:48:15

hibernate 一级缓存的相关文章

hibernate 一级缓存和二级缓存

hibernate一级缓存:session缓存即事务级缓存,session关闭,缓存自动销毁,开发人员不用管理,由hibernate管理,save.update.saveoOrUpdate.lock.load.list会自动向一级缓存中存放数据,get,load,list会自动从一级缓存中取数据,可调用evict(Object object)和clear()清除缓存. hibernate二级缓存:sessionFactory缓存即进程级别缓存,由缓存插件实现,如OSCache,对hibernat

(10)Hibernate一级缓存

1.为什么要用缓存? 目的:减少对数据库的访问次数!从而提升hibernate的执行效率! 2.Hibernate中缓存分类 一级缓存.二级缓存 3.一级缓存的概念 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效! 2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中

转载 hibernate一级缓存和二级缓存的区别

文章来源:http://blog.csdn.net/defonds/article/details/2308972     hibernate一级缓存和二级缓存的区别 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.

Hibernate一级缓存(补)

------------------siwuxie095 什么是缓存 缓存是介于应用程序和永久性数据存储源(如:硬盘上的文件 或 数据库) 之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提 高应用的运行性能 针对数据库,则: 数据是存到数据库中的,而数据库本身也是文件系统,使用流方式操作文 件的效率并不是很高 如果把数据存到内存里面,不需要使用流方式,就可以直接读取内存中的 数据,提高读取的效率 Hibernate 缓存 1.Hibernate 框架中提供了很多优化方式,Hibe

hibernate一级缓存,二级缓存和查询缓存

一级缓存 (必定存在)  session里共享缓存,伴随session的生命周期存在和消亡: 1. load查询实体支持一级缓存 2. get查询实体对象也支持 3. save保存的实体对象会缓存在一级缓存 4. clear evict会清除session缓存 5. save巨大数据,每20个数据,一般flush执行sql将数据持久化然后clear缓存,防止内存溢出,save放最后. 6. iterate使用一级缓存(creatQuery中的查询实体对象list会使用一级缓存,查询对象实体属性不

[转] Hibernate一级缓存、二级缓存

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. hibernate的缓存包括Session的缓存和SessionFactory的缓

hibernate一级缓存和二级缓存的区别

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. Hibernate的缓存包括Session的缓存和SessionFactory的缓

Hibernate一级缓存和二级缓存深度比较

1.什么是缓存 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. Hibernate的一级缓存是内置的,不能被卸载. Hiberna

Hibernate一级缓存和二级缓存具体解释

一.一级缓存二级缓存的概念解释 (1)一级缓存就是Session级别的缓存,一个Session做了一个查询操作,它会把这个操作的结果放在一级缓存中.假设短时间内这个 session(一定要同一个session)又做了同一个操作.那么hibernate直接从一级缓存中拿,而不会再去连数据库,取数据: (2)二级缓存就是SessionFactory级别的缓存,顾名思义.就是查询的时候会把查询结果缓存到二级缓存中,假设同一个sessionFactory 创建的某个session运行了同样的操作,hib