一、一级缓存与二级缓存

  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. Go 结构体(Struct)

    引用曾经看到的一篇文章里面对 Golang 中结构体的描述,如果说 Golang 的基础类型是原子,那么 结构体就是分子.我们都知道分子是由原子组成的,换言之就是结构体里面可以包含基础类型.切片. 字 ...

  2. (总结)CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL

    (总结)CentOS 6.x使用yum快速安装Apache+PHP+Tomcat(JSP)+MySQL PS:这个是懒人yum快速安装法,用于开发和测试环境很方便,用于没有特殊要求的生产环境也可以.特 ...

  3. Grunt、Gulp区别 webpack、 requirejs区别

    1. 书写方式 grunt 运用配置的思想来写打包脚本,一切皆配置,所以会出现比较多的配置项,诸如option,src,dest等等.而且不同的插件可能会有自己扩展字段,导致认知成本的提高,运用的时候 ...

  4. 力扣(LeetCode)70. 爬楼梯

    假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: 2 解释: 有两 ...

  5. cordova + Vue 开发 APP 上手指南

    什么是 cordova cordova 是由 Apache 基金会支持的,使用 HTML5 + CSS3 + JS 来构建多平台 APP 程序的开发框架.其支持调用手机系统(Android.IOS.W ...

  6. linux安装vmware

    在官网下载linux版 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html sudo chm ...

  7. Anaconda 简单介绍 -- 环境管理

    前面介绍了 Anaconda 的安装,接下来介绍一下 简单使用,后续并实时更新. 常用操作命令: 环境操作 1.查看环境管理的全部命令帮助: conda env -h 2.查看当前系统下的环境: co ...

  8. eslint简单的规范

    module.exports = { root: true, parser: 'babel-eslint', parserOptions: { sourceType: 'module' }, // h ...

  9. Unity中角度与弧度之间的相互转换

    弧度数 = 角度数 * Mathf.Deg2Rad角度数 = 弧度数 * Mathf.Rad2Deg

  10. 使用spss做方差分析

    还记得上学那会老师专门敲了黑板,强调方差分析很重要..单因素方差分析(Analysis of Variance, ANOVA),如果变量多,就是多因素方差分析,还需要考虑到多重共线性, 也就是线性代数 ...