Hibernate[四]
2019-11-01 / JAVA / 1292 次围观 / 0 次吐槽 /1、Hibernate整合log4j
1.1、Log4j是啥?【java日志】
n Log4j主要的功能在控制台输出固定格式的日志,把日志写在文件方便上线后的系统维护
1.2、整合步骤
第一步:
添加两个jar包,如下图
第二步:
把下图的log4j.properties文件导入项目的src目录中
1.3、日志配置讲解
l 配置文件内容:
1.记录器
2.输出源
3.布局
l 记录器
例如: log4j.rootLogger=info, stdout,file
格式:log4j.rootLogger=日志级别, 输出源1,输出源2,。。。。
log4j 日志级别 : fatal 致命错误 error 错误 warn 警告 info 信息 debug 调试信息 trace 堆栈信息 (由高到底顺序)
l 输出源:
例如:log4j.appender.file=org.apache.log4j.FileAppender
格式:log4j.appender.输出源的名称=输出源的实现类
名称:自定义
实现类:log4j提供
输出源属性例如:log4j.appender.file.File=d\:mylog.log
输出源属性格式:log4j.appender.名称.属性=值
2、一对一
Ø 一个公司只能有一个地址,一个地址也只能有一个公司,这就是一对一
Ø 以公司Company和地址Address为案例讲解
Ø 公司和地址的数据模型
2.1、一对一(外键)配置
@Test public void test2(){ Session session = HibernateUtils.openSession(); session.beginTransaction(); Company company = new Company(); company.setName("abc"); Address address = new Address(); address.setName("xxxxx"); address.setCompany(company); session.save(company); session.save(address); session.getTransaction().commit(); session.close(); } @Test public void test3(){ Session session = HibernateUtils.openSession(); session.beginTransaction(); //加载数据 Company company = (Company) session.get(Company.class, 2); System.out.println(company.getName() + ":" + company.getAddress().getName()); Address address = (Address) session.get(Address.class, 1); System.out.println(address.getCompany().getName() + ":" + address.getName()); session.getTransaction().commit(); session.close(); }
2.2、一对一 (主键) 配置
2、二级缓存
Hibernate的一级缓存,也就是session缓存
3.1 概念
3.1.1 缓存
缓存(Cache): 计算机领域非常通用的概念。它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写硬盘(永久性数据存储源)的频率,从而提高应用的运行性能。缓存中的数据是数据存储源中数据的拷贝。缓存的物理介质通常是内存
缓存:程序<--(内存)-->硬盘
3.1.2 二级缓存
Ø hibernate 提供缓存机制:一级缓存、二级缓存
一级缓存:session级别缓存,在一次请求中共享数据。
二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
Ø SessionFactory的缓存两部分:
内置缓存:使用一个Map,用于存放配置信息,预定义HQL语句等,提供给Hibernate框架自己使用,对外只读的。不能写入,也就是不能更改数据。
外置缓存:使用另一个Map,用于存放用户自定义数据。默认不开启。外置缓存hibernate只提供规范(接口),需要第三方实现类。
3.1.3 二级缓存的结构
Po,persist object持久化对象
l 二级就是由4部分构成
n 类级别缓存
n 集合级别缓存
n 时间戳缓存
n 查询缓存(二级缓存的第2大部分,又称三级缓存)
3.1.4 并发访问策略
3.1.5 应用场景
l 适合放入二级缓存中的数据:
很少被修改
不是很重要的数据, 允许出现偶尔的并发问题
在项目中哪些地方使用二级缓存:国家,地区信息
l 不适合放入二级缓存中的数据:
经常被修改
财务数据, 绝对不允许出现并发问题
与其他应用数据共享的数据
3.1.6 二级缓存提供商
Ø Hibernate中只定义二级缓存接口,实现需要自己选择提供商
l EHCache: 可作为进程(单机)范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 对 Hibernate 的查询缓存提供了支持。--支持集群。
l OpenSymphony `:可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, 对 Hibernate 的查询缓存提供了支持
l SwarmCache: 可作为集群范围内的缓存, 但不支持 Hibernate 的查询缓存
l JBossCache:可作为集群范围内的缓存, 支持 Hibernate 的查询缓存
X表示支持
3.2 整合
第一步:导包
第二步:配置hibernate.cfg.xml
默认情况,hibernate是不开启二级缓存,从hibernate.properties查找二级缓存配置
第三步:配置类和集合缓存
配置类缓存 注意:类缓存的配置是在mapping下,是dtd约束的 <class-cache usage="read-only" class="com.cheug.domain.Customer"/> <class-cache usage="read-only" class="com.cheug.domain.order"/> 配置集合缓存 <collection-cache usage="read-only" collection="com.cheug.domain.Customer.orders"/>
第四步:配置
把jar包中的ehcache-failsafe.xml文件复制到项目的src目录,然后改名为ehcache.xml
3.3 测试
证明二级缓存的存在
类级别缓存
类缓存:只存放数据,散装数据
一级缓存:存放对象本身
集合级别的缓存
只存放关联对象OID的值,如果需要数据,从类缓存中获取,如果类缓存中没有,从数据库找
<class-cache usage="read-only" class="com.cheug.domain.Customer"/>
查询缓存
n 查询缓存又称为三级缓存(民间)
n 查询缓存默认不使用。需要手动开启
n 查询缓存:将HQL语句与 查询结果进行绑定。通过HQL相同语句可以缓存内容。
n 默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。
n 查询缓存就是让Query可以从二级缓存获得内容。
步骤:
第一:开启查询缓存
<!-- 开启查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property>
测试
时间戳
v 时间戳:任何操作都在时间戳中记录操作时间。
v 举例:
3.4 ehcache配置文件
Ø maxElementsInMemory :设置基于内存的缓存中可存放的对象最大数目
Ø eternal:设置对象是否为永久的,true表示永不过期,此时将忽略
Ø timeToIdleSeconds 和 timeToLiveSeconds属性; 默认值是false
Ø timeToIdleSeconds:设置对象空闲最长时间,以秒为单位, 超过这个时间,对象过期。当对象过期时,EHCache会把它从缓存中清除。如果此值为0,表示对象可以无限期地处于空闲状态。
Ø timeToLiveSeconds:设置对象生存最长时间,超过这个时间,对象过期。如果此值为0,表示对象可以无限期地存在于缓存中. 该属性值必须大于或等于 timeToIdleSeconds 属性值
Ø overflowToDisk:设置基于内在的缓存中的对象数目达到上限后,是否把溢出的对象写到基于硬盘的缓存中
Ø diskPersistent 当jvm结束时是否持久化对象 true false 默认是false
Ø diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
Ø memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
- 上一篇:Hibernate[三]
- 下一篇:CentOS7网卡绑定IP
Powered By Cheug's Blog
Copyright Cheug Rights Reserved.