四、持久层框架(Hibernate)
一、一级缓存与二级缓存
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)的更多相关文章
- 菜鸟学习Hibernate——持久层框架
一.Java操作数据库的阶段. Java对数据库进行操作经历了三个阶段. 1.1操作JDBC阶段 这个阶段就是利用JDBC类来操作数据库.这个阶段出现了两个问题: 代码过度重复:在每一次数据库操作的是 ...
- Hibernate数据库持久层框架
Hibernate是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hib ...
- Hibernate: 数据持久层框架
Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...
- .NET平台下,关于数据持久层框架
在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...
- MyBatis持久层框架学习之01 MyBatis的起源和发展
一.MyBatis的简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...
- 持久层框架JPA与Mybatis该如何选型
一.现状描述 目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis.JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernat ...
- MyBatis持久层框架使用总结
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...
- 持久层框架之MyBatis
1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...
- Java数据持久层框架 MyBatis之背景知识三
摘录自:http://www.cnblogs.com/lcngu/p/5437281.html 对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.or ...
- Java数据持久层框架 MyBatis之背景知识二
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
随机推荐
- 七、面向对象编程(OOP)
面向对象编程:一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 1.类(class) class:自定义的对象数据类型.基于类创建多个对象,每个对象具备类的通用行 ...
- Linux学习之用户与root
因为想要建立建立一个目录,但是发现权限不够,因为没用root登陆,所以学习了一下普通用户与root之间如何切换以及如何创建用户的一些知识. 1.pwd命令可以查看当前用户 $这个符号代表的就是普通用户 ...
- Python学习 day04打卡
今天学习的主要内容: 一,列表 1,列表的介绍 列表是python的基础数据类型之一,其他编程语音也有类似的数据类型.例如:JS 中的数组Java中的数组等等. 它是以[]括起来,每个元素用',隔开而 ...
- [从零开始搭网站二]服务器环境配置:Mac电脑连接CentOS不用每次都输入密码
上一篇讲了如何购买服务器,并且***.看这里的第一篇文章: 从零开始搭网站 从这里开始的文章,我会默认大家都是最起码是入门级的程序员,如果你完全不懂我在说什么,那就退出好了. 作为开发人员,接下来为了 ...
- 前端性能优化之按需加载(React-router+webpack)
一.什么是按需加载 和异步加载script的目的一样(异步加载script的方法),按需加载/代码切割也可以解决首屏加载的速度. 什么时候需要按需加载 如果是大文件,使用按需加载就十分合适.比如一个近 ...
- 力扣(LeetCode)292. Nim游戏 巴什博奕
你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断你 ...
- leecode第一百三十六题(只出现一次的数字)
class Solution { public: int singleNumber(vector<int>& nums) { int len=nums.size(); ; ;i&l ...
- Flask-SQLAlchemy基本操作
db.session.rollback() 回滚"""Role.query.get(2) get查询接收的参数为主键,如果不存在,返回空 >>> Use ...
- 程序莫名其妙的崩溃,加断点刚进入函数就崩溃,断点不往下走,读取图片数据到程序并保存到一个HBITMAP 中
HPR_INT32 CCarManageDlg::DrawPic2UIForm(IUIFormObj* pUIForm,string& strPicName){//程序崩溃的地方 HPR_IN ...
- synchronized同步方法《一》
1.方法内的变量为线程安全 "非线程安全"问题存在于"实例变量"中,如果是方法内部的私有变量,则不存在"非线程安全"问题,所得结果也就是&q ...