文章标题

二、一级缓存
为什么要用缓存?
    目的:减少对数据库的访问次数(因为当修改数据库的时候,先把查询到的对象保存到缓存中,当修改的时候,修改语句会先跟缓存中的对象进行对比,如果是相同的对象,就不会再去查询并修改数据库了)!从而提升hibernate的执行效率!
Hibernate中缓存分类:
    一级缓存
    二级缓存
概念
1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效!
2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中。 
3Session的缓存由hibernate维护, 用户不能操作缓存内容; 如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
特点:
    只在(当前)session范围有效,作用时间短,效果不是特别明显!
    在短时间内多次操作数据库,效果比较明显!
缓存相关几个方法的作用
session.flush();       让一级缓存与数据库同步
        session.evict(arg0);    清空一级缓存中指定的对象
        session.clear();       清空一级缓存中缓存的所有对象

list与iterator查询的区别?
list() 
  一次把所有的记录都查询出来 (即只有一条sql语句),
会放入缓存,但不会从缓存中获取数据!!!(也就是说第二次查询时还
是从数据库中查,不会从缓存中查)
Iterator
  N+1查询(有N+1条sql语句); N表示所有的记录总数,即会先发送一条语句查询所有记录的主键(1),再根据每一个主键再去数据库查询(N)!
会放入缓存,也会从缓存中取数据!!!

package cn.itcast.a_status;

hibernate一级缓存随笔

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 + "]";
}

}

package cn.itcast.a_status;

import java.util.HashSet;
import java.util.Set;

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

public class App2_cache {

private static SessionFactory sf;
static {
    sf = new Configuration()
        .configure()
        .addClass(User.class)   // 测试时候使用
        .buildSessionFactory();
}

@Test
public void testCache() throws Exception {
    Session session = sf.openSession();
    session.beginTransaction();
    User user = null;
    **// 查询
    user = (User) session.get(User.class, 5);// 先检查缓存中是否有数据,如果有那么就不查询数据库,直接从缓存中获取
    user = (User) session.get(User.class, 5);// (因为上面一句的get方法会将查询到的数据放到缓存中,的那个同样的语句查询时会得到同样的结果)所以先检查缓存中是否有数据,如果有,则不查询数据库,直接从缓存中获取**

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



@Test
public void flush() throws Exception {
    Session session = sf.openSession();
    session.beginTransaction();

    User user = null;
    user = (User) session.get(User.class, 5);
    user.setUserName("Jack");
    // 缓存数据与数据库同步
    session.flush();/////每刷一次,就会在控制台多一条sql语句

    user.setUserName("Jack_new");////如果中间没有调用(session.flush()),那么就以最后一次修改为准,因为只会执行一次刷新(下面)

    session.getTransaction().commit();  //相当于 session.flush();刷新缓存数据,让其与数据库同步
    session.close();
}

@Test
public void clear() throws Exception {
    Session session = sf.openSession();
    session.beginTransaction();

    User user = null;
    // 查询
    user = (User) session.get(User.class, 5);
    // 清空缓存内容 

// session.clear(); // 清空所有
session.evict(user);// 清除指定

    user = (User) session.get(User.class, 5);


    session.getTransaction().commit();  // session.flush();
    session.close();
}

@Test
public void sessionTest() throws Exception {
    Session session1 = sf.openSession();
    session1.beginTransaction();
    Session session2 = sf.openSession();
    session2.beginTransaction();

    // user放入session1的缓存区
    User user = (User) session1.get(User.class, 1);
    // user放入session2的缓存区
    session2.update(user);

    // 修改对象
    user.setUserName("New Name");  // 2条update



    session1.getTransaction().commit();  // session1.flush();
    session1.close();
    session2.getTransaction().commit();  // session2.flush();
    session2.close();
}

}

*

<class name="User" table="t_user">
    <id name="userId" column="id">
        <generator class="native"></generator>
    </id>   
    <property name="userName"></property>
</class>

*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值