一、一级缓存与二级缓存

  1、一级缓存:Hibernate默认是开启一级缓存的,一级缓存存放在session里,一个Session做一次查询操作,会把这个操作的结果放在一级缓存中,如果短时间内这个session (同一个session)又做了同一个操作,那么hibernate直接从一级缓存中拿,而不用再去连接数据库,取数据。

一级缓存生命周期依赖于Session生命周期,Session被关闭后,缓存也结束。

  2、二级缓存:就是SessionFactory级别的缓存,查询的结果缓存到二级缓存中,同一个sessionFactory创建的某个session执行相同的操作,hibernate会从二级缓存中取结果,不会重新连接数据库

二级缓存被同一个SessionFactory里的所有Session共享,Session进行并发访问缓存时,必须对缓存更新,缓存生命周期依赖于SessionFactory周期,当SessionFactory被关闭后,二级缓存也结束。

二、一级缓存的应用代码如下 

Hibernate的一级缓存在Session上

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Category; public class TetHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure.buildSessionFactory();//建立一个SessionFactory对象
Session session=sf.openSession();//开启一个Session
session.beginTransaction();//开启事务 Category c1=(Category)session.get(Category.class,1);
System.out.println(c1.getName());
Category c2=(Category)session.get(Category.class,1);
System.out.println(c2.getName()); session.getTransaction().commit();
session.close();
sf.close();
}
}

三、二级缓存的应用代码如下

Hibernate的二级缓存在SessionFactory上

创建两个Session,session1,session2

session1:第一次获取id=1的Category会执行SQL语句,第二次获取id=1的Category不会执行SQL语句,因为有一级缓存

session2:获取id=1的Category,会执行SQL语句,因为第二个Session,没有缓存这个,所以会出现两条SQL语句执行。

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Category; public class TetHibernate{
public static void main(String[] args){
SessionFactory sf=new Configuration().configure.buildSessionFactory();//建立一个SessionFactory对象 Session session1=sf.openSession();//开启ession1
session1.beginTransaction();//开启session1事务
Category c1=(Category)session1.get(Category.class,1);
Category c2=(Category)session1.get(Category.class,1); session1.getTransaction().commit();
session1.close(); Session session2=sf.openSession()//开启session2
session2.beginTransaction();
Category c3=(Category)session2.get(Category.class,1);
session2.getTransaction().commit();
session2.close(); sf.close();
}
}

四、hibernate.cfg.xml中增加对二级缓存的配置

hibernate本身不提供二级缓存,都是使用第三方二级缓存插件,我们使用EhCache提供的二级缓存。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=GBK</property>
<property name="connection.username">root</property>
<property name="connection.password">admin</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property> <!--使用第三方插件Ehchache提供的二级缓存-->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <mapping resource="com/demo/pojo/Product.hbm.xml" />
<mapping resource="com/demo/pojo/Category.hbm.xml" />
<mapping resource="com/demo/pojo/User.hbm.xml" /> </session-factory> </hibernate-configuration>

五、在src目录下,创建一个ehcache.xml用来对EhCache的缓存配置

<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>
</ehcache>

六、对于要进行二级缓存的实体类的映射文件,进行相应配置

  增加<cache usage="read-only"/>,比如对Category.hbm.xml进行二级缓存

<?xml version="1.0"?>
<!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.demo.pojo">
<class name="Category" table="category_table">
<!--设置二级缓存配置-->
<cache usage="read-only" /> <id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<!--set用来设置一对多,或者多对多-->
<set name="products" lazy="true">
<key column="cid" not-null="false" />
<one-to-many class="Product" />
</set> </class>
</hibernate-mapping>

七、测试二级缓存 

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import com.demo.pojo.Category; public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session session1 = sf.openSession();//建立session1
session1.beginTransaction();//开启session1事务
Category c1 = (Category)session1.get(Category.class, 1);//第一次在连接数据库后获取到数据
Category c2= (Category)session1.get(Category.class, 1);//不用再次执行sql连接数据库,直接从一级缓存从取
session1.getTransaction().commit();
session1.close(); Session session2 = sf.openSession();//建立session2
session2.beginTransaction();//开启session2事务
Category c3 = (Category)session2.get(Category.class, 1);//由于给Category设置二级缓存,所以二级缓存在同一个SessionFactory下,不同session之间,可以共享,不用再次连接数据库,直接在SessionFactory中其获取数据
session2.getTransaction().commit();
session2.close(); sf.close();
}
}

四、持久层框架(Hibernate)的更多相关文章

  1. 菜鸟学习Hibernate——持久层框架

    一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...

  2. Hibernate数据库持久层框架

    Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...

  3. Hibernate: 数据持久层框架

    Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...

  4. .NET平台下,关于数据持久层框架

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  5. MyBatis持久层框架学习之01 MyBatis的起源和发展

    一.MyBatis的简介  MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  6. 持久层框架JPA与Mybatis该如何选型

    一.现状描述 目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis.JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernat ...

  7. MyBatis持久层框架使用总结

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...

  8. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  9. Java数据持久层框架 MyBatis之背景知识三

    摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...

  10. Java数据持久层框架 MyBatis之背景知识二

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

随机推荐

  1. 17. --cover-- 覆盖掩盖 (词19)

  2. 【译】第16节---数据注解-Table

    原文:http://www.entityframeworktutorial.net/code-first/table-dataannotations-attribute-in-code-first.a ...

  3. HDU 5985 Lucky Coins(概率)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5985 题意:有多种类型的硬币,每种类型的硬币都有一定的数量,现在每次抛硬币,除去朝下的硬币,知道最后 ...

  4. python线程 有问题?

  5. tarjan 缩点(模板)

    描述: 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 注:允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 思路: ...

  6. 远程连接MongoDB报“Network is unreachable”错误的解决方法

    解决办法:/etc/mongod.conf 里把127.0.0.1 改成 0.0.0.0

  7. python 排序 由大到小

    import functools class Solution: # @param {integer[]} nums # @return {string} def largestNumber(self ...

  8. python (协程)生产者,消费者

    #coding=utf- import gevent from gevent.queue import Queue, Empty import time tasks = Queue(maxsize=) ...

  9. C语言中的多线程编程

    很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...

  10. cin 与 getchar 中的坑

    今天在一道题上发现一个坑. 输入三个字符,按以下规则求其平均值. (1)如果是数字0~9,那么直接参与求值: (2)如果是其他字符,则其ASCII码参与求值. 输入 输入数据有多组.第一行是数据的组数 ...