1、为什么要用缓存?目的:减少对数据库的访问次数!从而提升hibernate的执行效率!2、Hibernate中缓存分类一级缓存、二级缓存3、一级缓存的概念1)Hibenate中一级缓存,也叫做sessio
目的:减少对数据库的访问次数!从而提升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(object); 清空一级缓存中指定的对象
session.clear(); 清空一级缓存中缓存的所有对象
在什么情况用上面方法?
批量操作使用使用:
Session.flush(); // 先与数据库同步
Session.clear(); // 再清空一级缓存内容
面试题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();
}
//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();
}
}
--结束END--
本文标题: (10)Hibernate一级缓存
本文链接: https://lsjlt.com/news/41727.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0