Hibernate day04笔记
整合log4j(了解)
- slf4j 核心jar : slf4j-api-1.6.1.jar 。slf4j是日志框架,将其他优秀的日志第三方进行整合。

- 整合导入jar包
log4j 核心包:log4j-1.2.17.jar
过渡jar(整合jar):slf4j-log4j12-1.7.5.jar
- 导入配置文件
log4j.properties ,此配置文件通知log4j 如何输出日志
- 配置文件内容:
1.记录器
2.输出源
3.布局
- 记录器
例如: log4j.rootLogger=info, stdout,file
格式:log4j.rootLogger=日志级别, 输出源1,输出源2,。。。。
log4j 日志级别 : fatal 致命错误 error 错误 warn 警告 info 信息 debug 调试信息 trace 堆栈信息 (由高到底顺序)
- 输出源:
例如:log4j.appender.file=org.apache.log4j.FileAppender
格式:log4j.appender.输出源的名称=输出源的实现类
名称:自定义
实现类:log4j提供
输出源属性例如:log4j.appender.file.File=d\:mylog.log
输出源属性格式:log4j.appender.名称.属性=值
每一个输出源对应一个实现类,实现类都属性(setter),底层执行setter方法进行赋值
- 常见的输出源实现类
org.apache.log4j.FileAppender 输出文件中
file ,表示文件输出位置
org.apache.log4j.ConsoleAppender 输出到控制台
Target ,表示使用哪种输出方式,在控制台打印内容,取值:System.out / System.err
- 布局 -- 确定输出格式
例如:log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
格式:log4j.appender.数据源.layout=org.apache.log4j.PatternLayout
布局属性:log4j.appender. 数据源.layout.ConversionPattern=值
12:56:30,123 info
- 扩展:对指定的目录设置日志级别
例如:log4j.logger.org.hibernate.transaction=debug
格式:log4j.logger.包结构=级别
一对一(了解)
- 情况1:主表的主键,与从表的外键(唯一),形成主外键关系
- 情况2:主表的主键,与从表的主键,形成主外键关系 (从表的主键又是外键)
情况1


情况2


二级缓存【掌握】
介绍
缓存
缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,
其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。
缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存
缓存:程序<--(内存)-->硬盘
什么是二级缓存
- hibernate 提供缓存机制:一级缓存、二级缓存
一级缓存:session级别缓存,在一次请求中共享数据。
二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
- SessionFactory的缓存两部分:
内置缓存:使用一个Map,用于存放配置信息,预定义HQL语句等,提供给Hibernate框架自己使用,对外只读的。不能操作。
外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。外置缓存有成为二级缓存。
二级缓存内部结构

- 二级就是由4部分构成
- 类级别缓存
- 集合级别缓存
- 时间戳缓存
- 查询缓存(二级缓存的第2大部分,三级缓存)
并发访问策略

- 访问策略:读写型(read-write)、只读型(read-only)
应用场景
- 适合放入二级缓存中的数据:
很少被修改
不是很重要的数据, 允许出现偶尔的并发问题
- 不适合放入二级缓存中的数据:
经常被修改
财务数据, 绝对不允许出现并发问题
与其他应用数据共享的数据
二级缓存提供商
- EHCache: 可作为进程(单机)范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。--支持集群。
- OpenSymphony `:可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持
- SwarmCache: 可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存
- JBossCache:可作为集群范围内的缓存, 支持 Hibernate 的查询缓存

X表示支持
配置(操作)
1.导入jar包:ehcache-1.5.0.jar/ commons-logging.jar/ backport-util-concurrent.jar
2.开启二级缓存(我要使用二级缓存)
3.确定二级缓存提供商(我要使用哪个二级缓存)
4.确定需要缓存内容
1>配置需要缓存的类
2>配置需要缓存的集合
5.配置ehcache自定义配置文件
导入jar包

开启二级缓存

- 在hibernate.cfg.xml 配置二级缓存
|
<!-- 9.1 开启二级缓存 --> <property |
确定提供商

- hibernate.cfg.xml 配置
|
<!-- 9.2 提供商 --> <property
|
确定缓存内容
- 在hibernate.cfg.xml 确定 类缓存 和集合缓存配置项

- 配置
|
<!-- 9.3 确定缓存内容 --> <!-- 类缓存 --> <class-cache <class-cache <!-- 集合缓存 --> <collection-cache |
ehcache配置文件
步骤1:从jar包复制xml文件

步骤2:将xml重命名"ehcache.xml"

步骤3:将修改后的xml,拷贝到src下

演示
证明
|
@Test public //1 证明二级缓存存在 // * 修改toString() // * 如果二级缓存开启,查询3 没有select语句,表示从二级缓存获得的。 将触发select语句。 Session s1 = factory.openSession(); s1.beginTransaction();
//1 查询id=1 -- 执行select (查询后,将数据存放在一级缓存,之后由一级缓存同步到二级缓存) Customer c1 = (Customer) s1.get(Customer.class, 1); System.out.println(c1); //2 查询id=1 --从一级缓存获取 Customer c2 = (Customer) s1.get(Customer.class, 1); System.out.println(c2);
s1.getTransaction().commit(); s1.close();
System.out.println("----------");
Session s2 = factory.openSession(); s2.beginTransaction();
//3 查询id=1 -- 从二级缓存获取 Customer c3 = (Customer) s2.get(Customer.class, 1); System.out.println(c3);
s2.getTransaction().commit(); s2.close(); } |
类缓存
- 类缓存:只存放数据
- 一级缓存:存放对象本身

|
@Test public //2 类缓存:只存放数据,散装数据。 // * 使用默认的toString(); Session s1 = factory.openSession(); s1.beginTransaction();
//1 查询id=1 -- 执行select Customer c1 = (Customer) s1.get(Customer.class, 1); System.out.println(c1); //2 查询id=1 -- 从一级缓存获取,一级缓存存放对象本身 Customer c2 = (Customer) s1.get(Customer.class, 1); System.out.println(c2);
s1.getTransaction().commit(); s1.close();
System.out.println("----------");
Session s2 = factory.openSession(); s2.beginTransaction();
//3 查询id=1 -- 对象不一样,数据一样 Customer c3 = (Customer) s2.get(Customer.class, 1); System.out.println(c3);
s2.getTransaction().commit(); s2.close(); } |
集合缓存


|
@Test public //3 集合缓存:只存放关联对象OID的值,如果需要数据,从类缓存中获取。 // * 3.1 默认:第一条select 查询客户,第二天 select 查询客户所有订单 // * 3.2 操作:在hibernate.cfg.xml 将 Order 类缓存删除 // *** <!-- <class-cache usage="read-write" class="com.itheima.a_init.Order"/>--> 条select,通过订单的id查询订单 Session s1 = factory.openSession(); s1.beginTransaction();
//1 查询id=1 Customer c1 = (Customer) s1.get(Customer.class, 1); System.out.println(c1); //2 获得订单 for (Order o1 : c1.getOrderSet()) { System.out.println(o1); }
s1.getTransaction().commit(); s1.close();
System.out.println("----------");
Session s2 = factory.openSession(); s2.beginTransaction();
//3 查询id=1 Customer c3 = (Customer) s2.get(Customer.class, 1); System.out.println(c3); //4 获得订单 for (Order o2 : c3.getOrderSet()) { System.out.println(o2); }
s2.getTransaction().commit(); s2.close(); } |
时间戳
- 时间戳:任何操作都在时间戳中记录操作时间。

|
@Test public //4 时间戳: 所有的操作都会在时间戳中进行记录,如果数据不一致,将触发select语句进行查询 // * 修改toString() Session s1 = factory.openSession(); s1.beginTransaction();
//1 查询id=1 Integer cid = 1; Customer c1 = (Customer) s1.get(Customer.class, cid); System.out.println(c1); //2 绕过一级和二级缓存,修改数据库,修改客户cname=大东哥 s1.createQuery("update Customer set cname = ? where cid = ?") .setString(0, "大东哥") .setInteger(1, cid) .executeUpdate(); //3打印 System.out.println(c1);
s1.getTransaction().commit(); s1.close();
System.out.println("----------");
Session s2 = factory.openSession(); s2.beginTransaction();
//4 查询id=1 -- ? Customer c3 = (Customer) s2.get(Customer.class, 1); System.out.println(c3);
s2.getTransaction().commit(); s2.close(); } |
查询缓存
- 查询缓存又称为三级缓存(民间)
- 查询缓存默认不使用。需要手动开启
- 查询缓存:将HQL语句与 查询结果进行绑定。通过HQL相同语句可以缓存内容。
默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。
查询缓存就是让Query可以从二级缓存获得内容。
步骤一:开启查询缓存

|
<!-- 9.4 开启查询缓存 --> <property
|
步骤二:在查询query对象,设置缓存内容(注意:存放和查询 都需要设置)


|
@Test public //5 查询缓存 Session s1 = factory.openSession(); s1.beginTransaction();
//1 query查询 Query q1 = s1.createQuery("from Customer"); q1.setCacheable(true); List<Customer> a1 = q1.list(); for (Customer c1 : a1) { System.out.println(c1); }
//2 cid =1 -- 一级缓存获得 Customer customer = (Customer) s1.get(Customer.class, 1); System.out.println(customer);
s1.getTransaction().commit(); s1.close();
System.out.println("----------");
Session s2 = factory.openSession(); s2.beginTransaction();
//2 cid =1 -- 二级缓存获得 Customer customer2 = (Customer) s2.get(Customer.class, 1); System.out.println(customer2);
//3 query查询 Query q2 = s2.createQuery("from Customer"); q2.setCacheable(true); List<Customer> a2 = q2.list(); for (Customer c2 : a2) { System.out.println(c2); }
s2.getTransaction().commit(); s2.close(); } |
ehcache配置文件
- <diskStore path="java.io.tmpdir"/> 设置临时文件存放位置。(缓存一般内存,一定程度时,写入硬盘。)

- 缓存详细设置
<defaultCache> 所有的缓存对象默认的配置
<cache name="类"> 指定对象单独配置
- 参数设置
maxElementsInMemory="10000" 内存最大数
eternal="false" 是否永久(内存常驻留)
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true" 内存满了,是否写入到硬盘
maxElementsOnDisk="10000000" 硬盘最大数
diskPersistent="false" 关闭JVM,是否将内存保存硬盘中
diskExpiryThreadIntervalSeconds="120" 轮询
memoryStoreEvictionPolicy="LRU"
Least Recently Used (specified as LRU).
First In First Out (specified as FIFO)
Less Frequently Used (specified as LFU)
|
Hibernate day04笔记的更多相关文章
- hibernate关联关系笔记
Hibernate关联关系笔记 单向N:1 * 有连接表:在N方使用<join>/<many-to-one>.1方无需配置与之关联的持久化类. * 没有连接表:在N方使用& ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- python day04笔记总结
2019.4.1 S21 day04笔记总结 昨日内容补充 1.解释器/编译器 1.解释型语言.编译型语言 2.解释型:写完代码后提交给解释器,解释器将代码一行行执行.(边接收边解释/实时解释) 常用 ...
- Spring day04笔记(SVN讲解和回顾昨天知识)
spring day03回顾 事务管理 基于xml配置 1.配置事务管理器 jdbc:DataSourceTransactionManager hibernate:HibernateTransacti ...
- Hibernate学习笔记
一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
随机推荐
- 【OpenCV】图像的遍历
Mat类的两种遍历比较快的方式,分别给出了按行和按列遍历,以及运行过程图. 原图: 按行遍历过程图 按列遍历过程图 代码如下: //ptr逐行访问 void ptrScanX(Mat& src ...
- Mark一下,一上午就这么过去了,关于客户端连接oracle10G的问题
Mark一下,一上午就这么过去了,关于客户端连接oracle10G的问题 正常的客户端PLSQL和Navicat都可以正常连接Oracle(局域网内),但代码生成器和VS2015死活连不上,在网上找了 ...
- day15_集合第一天
1.集合体系 红色为今天所学 Collection (接口)|--List (接口) 元素有序,可以重复 ...
- [翻译]lpeg入门教程
原文地址:http://lua-users.org/wiki/LpegTutorial 简单匹配 LPeg是一个用于文本匹配的有力表达方式,比Lua原生的字符串匹配和标准正则表达式更优异.但是,就像其 ...
- 【转载】知乎答案----孙志岗----Google 发布了程序员养成指南,国内互联网巨头是否也有类似的指南和课程推荐
国内公司在复制国外商业模式的同时,也应复制人家的社会担当.所以,来答题了!就参考 Google 的框架,列一下中文的课程.大体上在线学完一个计算机专业,是基本不成问题的.但是,这不意味着你可以不上大学 ...
- linux下安装mongodb(php版本5.3)
转:原文出处忘记了. 1. 下载MongoDB 2. 解压文件到某目录下,然后重命名: [root@localhost var]# tar -xzvf mongodb-linux-i686-2.0.1 ...
- Node.js高级编程读书笔记 - 1 基本概念
Outline 1 概述和安装 1.1 安装Node 1.2 Node简介 2 Node核心API基础 2.1 加载模块 2.2 应用缓冲区处理.编码和解码二进制数据 2.3 使用时间发射器模式简化事 ...
- 腾讯优测优分享 | 这些年,我们追过的 fiddler
腾讯优测是专业的移动云测试平台,提供全面兼容性测试,远程真机租用,漏洞分析等多维度的测试服务,旗下优分享提供大量的移动研发及测试相关的干货! 一.fiddler原理简介 fiddler是目前最强大最好 ...
- codeforces195a
link:http://codeforces.com/problemset/problem/336/A 很简单的一道题目,当初有个单词不认识,isosceles原来意思是等腰的o(╯□╰)o #inc ...
- [原创]cocos2d-x研习录-第二阶 概念类之布场层类(CCLayer)
上面说场景CCScene相当于一个大容器,那么布景层类CCLayer就是大容器里的若干个小容器.每个游戏场景CCScene会有很多层CCLayer,每一层CCLayer负责各自的任务.看一下CCLay ...