温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

(10)Hibernate一级缓存

发布时间:2020-07-15 13:55:08 来源:网络 阅读:272 作者:lsieun 栏目:数据库


1、为什么要用缓存?

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


2、Hibernate中缓存分类

一级缓存、二级缓存


3、一级缓存的概念

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

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

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


4、Hibernate一级缓存的特点

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

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



5、缓存相关几个方法及作用

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

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

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

 

在什么情况用上面方法?

批量操作使用使用:

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

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


6、Hibernate一级缓存的面试题

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

不会。

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

list():一次把所有的记录都查询出来,会放入缓存,但不会从缓存中获取数据。

Iterator():进行N+1次查询; N表示所有的记录总数。即会先发送一条语句查询所有记录的主键(1次),再根据每一个主键再去数据库查询(N次)!会放入缓存,也会从缓存中取数据!



User.java

package com.rk.hibernate.i_status;

public class User
{
	private int userId;
	private String username;
	public int getUserId()
	{
		return userId;
	}
	public void setUserId(int userId)
	{
		this.userId = userId;
	}
	public String getUsername()
	{
		return username;
	}
	public void setUsername(String username)
	{
		this.username = username;
	}
	@Override
	public String toString()
	{
		return "User [userId=" + userId + ", username=" + username + "]";
	}
	
}

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.rk.hibernate.i_status" auto-import="true">
	<class name="User" table="T_Users">
		<id name="userId" column="id">
			<generator class="native"></generator>
		</id>
		<property name="username" column="name" type="string"></property>
	</class>
</hibernate-mapping>

App2_Cache.java

package com.rk.hibernate.i_status;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App2_Cache
{
	private static SessionFactory sf;
	static
	{
		sf = new Configuration()
						.configure()
						.addClass(User.class)
						.buildSessionFactory();
	}
	
	@Test
	public void testGet()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		// 查询
		User u1 = (User) session.get(User.class, 2);// 先检查缓存中是否有数据,如果有,则不查询数据库,直接从缓存中获取
		User u2 = (User) session.get(User.class, 2);
		
		System.out.println(u1);
		System.out.println(u2);
		System.out.println(u1 == u2); // true
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testFlush()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		User u = (User)session.get(User.class, 2);
		u.setUsername("ABC");
		
		// 缓存数据与数据库同步
		session.flush(); //如果没有这一语句,则执行一次update;加上这条语句后,执行两次update。
		
		u.setUsername("DEF");
		
		session.getTransaction().commit();// session.flush();
		session.close();
	}
	
	@Test
	public void testClear()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		// 查询
		User u1 = (User)session.get(User.class, 2);
		
		// 清空缓存内容
//		session.clear();// 清空所有
		session.evict(u1);// 清除指定
		
		User u2 = (User)session.get(User.class, 2);
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testSessionScope()
	{
		Session session1 = sf.openSession();
		session1.beginTransaction();
		
		Session session2 = sf.openSession();
		session2.beginTransaction();
		
		// u1放入session1的缓存区
		User u1 = (User) session1.get(User.class, 2);
		// u2放入session2的缓存区
		User u2 = (User) session2.get(User.class, 2);
		
		
		session1.getTransaction().commit();
		session1.close();
		
		session2.getTransaction().commit();
		session2.close();
	}
}

App3_List_Iterator.java

package com.rk.hibernate.i_status;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class App3_List_Iterator
{
	private static SessionFactory sf;
	static
	{
		sf = new Configuration()
						.configure()
						.addClass(User.class)
						.buildSessionFactory();
	}
	
	/**
	 * list与iterator区别
	 * 1. list 方法
	 * 2. iterator 方法
	 * 3. 缓存
	 * @throws Exception
	 */
	//1.  list 方法
	@Test
	public void list()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		// HQL查询
		Query q = session.createQuery("from User ");
		// list()方法
		List<User> list = q.list();

		for (int i = 0; i < list.size(); i++)
		{
			System.out.println(list.get(i));
		}

		session.getTransaction().commit();
		session.close();
	}
	
	//2. iterator 方法
	@Test
	public void iterator() throws Exception
	{
		Session session = sf.openSession();
		session.beginTransaction();
		// HQL查询
		Query q = session.createQuery("from User ");
		// iterator()方法
		Iterator<User> it = q.iterate();
		while (it.hasNext())
		{
			// 得到当前迭代的每一个对象
			User user = it.next();
			System.out.println(user);
		}
		
		
		
		session.getTransaction().commit();  
		session.close();
	}
	
	//3. 测试List缓存
	@Test
	public void testList()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		Query q = session.createQuery("from User");
		List<User> list1 = q.list();
		if(list1 != null && list1.size()>0)
		{
			for(User u : list1)
			{
				System.out.println(u);
			}
		}
		
		System.out.println("------------------------------------");
		List<User> list2 = q.list();
		if(list2 != null && list2.size()>0)
		{
			for(User u : list2)
			{
				System.out.println(u);
			}
		}
		
		System.out.println("list1 == list2 ?  " + (list1 == list2)); // false
		
		for(int i=0;i<list1.size();i++)
		{
			User u1 = list1.get(i);
			User u2 = list2.get(i);
			System.out.println(u1 == u2); //true
		}
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testIterator()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		Query q = session.createQuery("from User");
		Iterator<User> it = q.iterate();
		while(it.hasNext())
		{
			User u = it.next();
			System.out.println(u);
		}
		
		System.out.println("------------------------------------");
		it = q.iterate();
		while(it.hasNext())
		{
			User u = it.next();
			System.out.println(u);
		}
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testListIterator()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		Query q = session.createQuery("from User");
		List<User> list = q.list();
		for(User u : list)
		{
			System.out.println(u);
		}
		
		System.out.println("--------------------------------------------");
		
		Iterator<User> it = q.iterate();
		while(it.hasNext())
		{
			User u = it.next();
			System.out.println(u);
		}
		
		session.getTransaction().commit();
		session.close();
	}
	
	@Test
	public void testGet()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		Query q = session.createQuery("from User ");
		List<User> list = q.list();
		for (int i = 0; i < list.size(); i++)
		{
			System.out.println(list.get(i));
		}
		
		Query q2 = session.createQuery("from User where userId<5");
		Iterator<User> it = q2.iterate();
		while (it.hasNext())
		{
			// 得到当前迭代的每一个对象
			User user = it.next();
			System.out.println(user);
		}
		
		session.getTransaction().commit();
		session.close();
	}
	
	public void temp()
	{
		Session session = sf.openSession();
		session.beginTransaction();
		
		
		
		session.getTransaction().commit();
		session.close();
	}
}




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI