Cheug's Blog

当前位置:网站首页 / JAVA / 正文

Hibernate[四]

2019-11-01 / JAVA / 1292 次围观 / 0 次吐槽 /

1、Hibernate整合log4j

1.1Log4j是啥?【java日志】

n  Log4j主要的功能在控制台输出固定格式的日志,把日志写在文件方便上线后的系统维护

1.2、整合步骤

第一步:

添加两个jar包,如下图

image.png

第二步:

把下图的log4j.properties文件导入项目的src目录中


image.png

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为案例讲解

Ø  公司和地址的数据模型

image.pngimage.png

2.1、一对一(外键)配置

image.png

image.png

@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、一对一 (主键) 配置

image.png

image.png

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持久化对象image.png

image.png

l  二级就是由4部分构成

n  类级别缓存

n  集合级别缓存

n  时间戳缓存

n  查询缓存(二级缓存的第2大部分,又称三级缓存)

 

3.1.4 并发访问策略

image.png

3.1.5 应用场景

l  适合放入二级缓存中的数据:

         很少被修改

         不是很重要的数据, 允许出现偶尔的并发问题

 

在项目中哪些地方使用二级缓存:国家,地区信息

l  不适合放入二级缓存中的数据:

         经常被修改

         财务数据, 绝对不允许出现并发问题

         与其他应用数据共享的数据

 

3.1.6 二级缓存提供商

Ø  Hibernate中只定义二级缓存接口,实现需要自己选择提供商

l  EHCache: 可作为进程(单机)范围内的缓存, 存放数据的物理介质可以是内存或硬盘, Hibernate 的查询缓存提供了支持。--支持集群

l  OpenSymphony `:可作为进程范围内的缓存, 存放数据的物理介质可以是内存或硬盘, 提供了丰富的缓存数据过期策略, Hibernate 的查询缓存提供了支持

l  SwarmCache: 可作为集群范围内的缓存, 不支持 Hibernate 的查询缓存

l  JBossCache:可作为集群范围内的缓存, 支持 Hibernate 的查询缓存

image.png

X表示支持

 

3.2 整合

第一步:导包

image.png

第二步:配置hibernate.cfg.xml

默认情况,hibernate是不开启二级缓存,hibernate.properties查找二级缓存配置

image.png

image.png

第三步:配置类和集合缓存

配置类缓存
注意:类缓存的配置是在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

image.png

3.3 测试

证明二级缓存的存在

image.png

类级别缓存

类缓存:只存放数据,散装数据

一级缓存:存放对象本身

image.png

集合级别的缓存

只存放关联对象OID的值,如果需要数据,从类缓存中获取,如果类缓存中没有,从数据库找

image.png

image.png

<class-cache usage="read-only" class="com.cheug.domain.Customer"/>

查询缓存

n  查询缓存又称为三级缓存(民间)

n  查询缓存默认不使用。需要手动开启

n  查询缓存:将HQL语句与 查询结果进行绑定。通过HQL相同语句可以缓存内容。

n  默认情况Query对象只将查询结果存放在一级和二级缓存,不从一级或二级缓存获取。

n  查询缓存就是让Query可以从二级缓存获得内容。

image.png

步骤:

第一:开启查询缓存

<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>

测试

image.png

时间戳

v  时间戳:任何操作都在时间戳中记录操作时间。

v  举例:

image.png

3.4 ehcache配置文件

image.png

Ø  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(先进先出)


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.