
創(chuàng)新互聯(lián)咨詢熱線:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)網(wǎng)頁制作領(lǐng)域10余年,包括成都活動板房等多個方面擁有多年的網(wǎng)站制作經(jīng)驗,選擇創(chuàng)新互聯(lián),為企業(yè)錦上添花!
目的:減少對數(shù)據(jù)庫的訪問次數(shù)!從而提升hibernate的執(zhí)行效率!
一級緩存、二級緩存
1)Hibenate中一級緩存,也叫做session的緩存,它可以在session范圍內(nèi)減少數(shù)據(jù)庫的訪問次數(shù)! 只在session范圍有效! Session關(guān)閉,一級緩存失效!
2)當調(diào)用session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把對象放入session的緩存中。
3)Session的緩存由hibernate維護, 用戶不能操作緩存內(nèi)容; 如果想操作緩存內(nèi)容,必須通過hibernate提供的evit/clear方法操作。
只在(當前)session范圍有效,作用時間短,效果不是特別明顯!
在短時間內(nèi)多次操作數(shù)據(jù)庫,效果比較明顯!
session.flush(); 讓一級緩存與數(shù)據(jù)庫同步
session.evict(object); 清空一級緩存中指定的對象
session.clear(); 清空一級緩存中緩存的所有對象
在什么情況用上面方法?
批量操作使用使用:
Session.flush(); // 先與數(shù)據(jù)庫同步
Session.clear(); // 再清空一級緩存內(nèi)容
面試題1: 不同的session是否會共享緩存數(shù)據(jù)?
不會。
面試題2: list與iterator查詢的區(qū)別?
list():一次把所有的記錄都查詢出來,會放入緩存,但不會從緩存中獲取數(shù)據(jù)。
Iterator():進行N+1次查詢; N表示所有的記錄總數(shù)。即會先發(fā)送一條語句查詢所有記錄的主鍵(1次),再根據(jù)每一個主鍵再去數(shù)據(jù)庫查詢(N次)!會放入緩存,也會從緩存中取數(shù)據(jù)!
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);// 先檢查緩存中是否有數(shù)據(jù),如果有,則不查詢數(shù)據(jù)庫,直接從緩存中獲取
		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");
		
		// 緩存數(shù)據(jù)與數(shù)據(jù)庫同步
		session.flush(); //如果沒有這一語句,則執(zhí)行一次update;加上這條語句后,執(zhí)行兩次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);
		
		// 清空緩存內(nèi)容
//		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的緩存區(qū)
		User u1 = (User) session1.get(User.class, 2);
		// u2放入session2的緩存區(qū)
		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區(qū)別
	 * 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();
	}
}            
                當前標題:(10)Hibernate一級緩存
                
                轉(zhuǎn)載來于:http://www.chinadenli.net/article6/piiiig.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、定制網(wǎng)站、服務(wù)器托管、網(wǎng)站收錄、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)