Hibernate学习11——配置Hibernate二级缓存

一、缓存的概念:                                                

以空间换时间;

二、Hibernate缓存的分类:                                        

前面我们讲的缓存都是session缓存;也叫一级缓存;get,load等缓存都是内置的,一级缓存;

SessionFactory缓存,二级缓存;

这里以Class —— Student,1对多的关系(单向)来例子说明下:

Class.java:

package com.cy.model;

public class Class {
    private int id;
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Student.java:

package com.cy.model;

import com.cy.model.Class;

public class Student {
    private int id;
    private String name;
    private Class c;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Class getC() {
        return c;
    }
    public void setC(Class c) {
        this.c = c;
    }

}

Class.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Class" table="t_class">
        <id name="id" column="classId">
            <generator class="native"></generator>
        </id>
        <property name="name" column="className"></property>
    </class>

</hibernate-mapping>

Student.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Student" table="t_student">
        <id name="id" column="stuId">
            <generator class="native"></generator>
        </id>
        <property name="name" column="stuName"></property>

        <many-to-one name="c" class="com.cy.model.Class" column="classId" cascade="save-update"></many-to-one>
    </class>

</hibernate-mapping>

StudentTest.java:

package com.cy.service;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.cy.model.Class;
import com.cy.util.HibernateUtil;

public class StudentTest {

    private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
    private Session session;

    @Before
    public void setUp() throws Exception {
        session=sessionFactory.openSession();
        session.beginTransaction();
    }

    @After
    public void tearDown() throws Exception {
         session.getTransaction().commit();
         session.close();
    }

    /**
     * 同一个session中,同一个事务是有一级缓存的;
     */
    @Test
    public void testCache1(){
        Class c = (Class) session.get(Class.class, 1);
        System.out.println(c.getName());

        Class c2 = (Class) session.get(Class.class, 1);
        System.out.println(c2.getName());
        System.out.println(c == c2);

        /*
         *  Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?
            08计算机本科
            08计算机本科
            true

            第一次取c1的时候,已经将取出来的数据c1放到缓存中。
            第二次取c2的时候,是有session缓存的。首选从缓存中找,找到,直接从缓存中拿,而不到数据库中去取了。
            两个是同一个OID对象;
         */
    }

    /**
     * 在不同的事务中,是否有缓存?
     */
    @Test
    public void testCache2(){
        Session session1 = sessionFactory.openSession();
        session1.beginTransaction();
        Class c = (Class) session1.get(Class.class, 1);
        System.out.println(c.getName());
        session1.getTransaction().commit();
        session1.close();

        Session session2 = sessionFactory.openSession();
        session2.beginTransaction();
        Class c2 = (Class) session2.get(Class.class, 1);
        System.out.println(c2.getName());
        session2.getTransaction().commit();
        session2.close();

        System.out.println(c == c2);
        /*
         *  Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?
            08计算机本科
            Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?
            08计算机本科
            false

            虽然在同一个session中有缓存,但是这里新开辟了一个事务,发出两个sql
            不同的事务是不能共用一级缓存的。
            一级缓存只适用于同一个session,同一个事务;
         */
    }
}

三、二级缓存策略提供商:                                          

时间: 2024-10-19 22:02:20

Hibernate学习11——配置Hibernate二级缓存的相关文章

Hibernate学习(九)———— 二级缓存和事务级别详讲

序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人博客应该也差不多可以做出来了.基本上先这样定下来,开始完成hibernate的东西把.这章结束后,我会将我一些hibernate的资料奉上,供大家一起学习. ---WH 一.概述 这章总的分两大块来讲解, 第一大块,hibernate的事务管理.,对于hibernate的事务管理来说,如果之前学过数

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate学习笔记(六) — Hibernate的二级缓存

我们知道hibernate的一级缓存是将数据缓存到了session中从而减少与数据库的交互.那么二级缓存呢? 一.应用场合 比如,在12306购票时,需要选择出发地与目的地,如果每点一次都与数据库交互一次,这就很不合适,这些地点数据在相当长的一段时间内是不会发生变化的(山东省在相当长的时间内还叫山东省),所以应该缓存起来,没必要每次都与数据库交互,而且该类数据安全性也不是很高. 适合二级缓存的数据: 在现代软件开发中,确实存在一类数据没有什么私有性,为公开的数据,数据基本上不发生变化,该数据保密

Hibernate学习——一般配置

mysql建表语句: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Employee.java package com.study; public class Employee { private

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

 1 PersonTestMapper.xml中的内容如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间

Hibernate学习笔记(2)Hibernate问题

(1)数据库驱动问题 log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please initialize the log4j system properly. Exception in thread "main" org.hibernate.HibernateException: JDBC Driver class not found: com.m

Hibernate学习11——Hibernate 高级配置

第一节:配置数据库连接池 这里配置c3p0连接池,需要的jar包: jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p0 文档中介绍了两种配置方式: 1)在hibernate.properties中配置: 2)在hibernate.cfg.xml中配置: <hibernate-configuration> <session-factory> <!--数据库连接设置 --> <prop

JPA学习笔记(11)——使用二级缓存

一级缓存 查询两次id为1的user User user1 = entityManager.find(User.class, 1); User user2 = entityManager.find(User.class, 1); 结果发现仅仅调用了一次sql查询,由于使用了一级缓存 假设查询一次后,关掉entityManager,再查询 User user1 = entityManager.find(User.class, 1); entityManager.close(); entityMan