hibernate框架学习之二级缓存(测试用例)
HqlDemoApp.java
package cn.itcast.h3.query.hql; import java.io.Serializable; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction; import cn.itcast.h3.query.hql.vo.StudentModel;
import cn.itcast.h3.query.hql.vo.TeacherModel;
import cn.itcast.util.HibernateUtil; public class HqlDemoApp {
//测试是否存在二级缓存
void testHasCache(){
Session s = HibernateUtil.getSession();
//读取数据,并且将数据加载入当前Session的一级缓存,
//同时加载到当前SessionFactory的二级缓存
TeacherModel tm1 = (TeacherModel) s.get(TeacherModel.class, 3L);
System.out.println(tm1);
//读取的是当前Session的一级缓存数据
TeacherModel tm2 = (TeacherModel) s.get(TeacherModel.class, 3L);
System.out.println(tm2);
s.close();
System.out.println("-----------------------------");
Session s2 = HibernateUtil.getSession();
//读取的是二级缓存的数据
TeacherModel tm3 = (TeacherModel) s2.get(TeacherModel.class, 3L);
System.out.println(tm3);
TeacherModel tm5 = (TeacherModel) s2.get(TeacherModel.class, 3L);
System.out.println(tm5);
s2.close();
System.out.println("--------------------------");
Session s3 = HibernateUtil.getSession();
//读取的是二级缓存的数据
TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
System.out.println(tm4);
s3.close(); }
//测试SQL查询数据是否加载二级缓存
void testQueryToCache(){
Session s = HibernateUtil.getSession();
Query q = s.createQuery("from TeacherModel");
q.list();
Query q2 = s.createQuery("from TeacherModel");
q2.list();
s.close();
System.out.println("--------------------");
Session s3 = HibernateUtil.getSession();
TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
System.out.println(tm4);
s3.close();
}
//测试SQL查询是否读取二级缓存数据
void testQueryToCache2(){
Session s3 = HibernateUtil.getSession();
TeacherModel tm4 = (TeacherModel) s3.get(TeacherModel.class, 3L);
System.out.println(tm4);
s3.close();
System.out.println("--------------------");
Session s = HibernateUtil.getSession();
Query q = s.createQuery("from TeacherModel where uuid = :uuid");
q.setLong("uuid", 3L);
TeacherModel tm = (TeacherModel) q.uniqueResult();
System.out.println(tm);
s.close(); }
//测试保存数据是否影响二级缓存数据
void testSaveToCache(){
//保存数据
Session s3 = HibernateUtil.getSession();
Transaction t = s3.beginTransaction();
TeacherModel tm = new TeacherModel();
tm.setTeacherName("aaa");
tm.setNick("bbb"); Serializable uuid = s3.save(tm); t.commit();
s3.close(); System.out.println("--------------------"); Session s = HibernateUtil.getSession();
TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, uuid);
System.out.println(tm4);
s.close(); }
//测试删除数据是否影响二级缓存数据
void testDeleteToCache(){
//保存数据
Session s3 = HibernateUtil.getSession();
Transaction t = s3.beginTransaction();
TeacherModel tm = (TeacherModel) s3.get(TeacherModel.class, 6L); s3.delete(tm); t.commit();
s3.close(); System.out.println("--------------------"); Session s = HibernateUtil.getSession();
TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, 6L);
System.out.println(tm4);
s.close(); }
//测试更新数据是否影响二级缓存数据
void testUpdateToCache(){
//保存数据
Session s3 = HibernateUtil.getSession();
Transaction t = s3.beginTransaction();
TeacherModel tm = (TeacherModel) s3.get(TeacherModel.class, 4L);
tm.setTeacherName("hahahh");
s3.update(tm);
t.commit();
s3.close(); System.out.println("--------------------"); Session s = HibernateUtil.getSession();
TeacherModel tm4 = (TeacherModel) s.get(TeacherModel.class, 4L);
System.out.println(tm4);
s.close(); }
//测试集合操作二级缓存
void testCollectionToCache(){
Session s = HibernateUtil.getSession();
TeacherModel tm = (TeacherModel) s.get(TeacherModel.class, 1L);
System.out.println(tm.getStudents());
s.close();
System.out.println("----------------");
Session s2 = HibernateUtil.getSession();
TeacherModel tm2 = (TeacherModel) s2.get(TeacherModel.class, 1L);
System.out.println(tm2.getStudents());
s2.close();
}
//DML影响二级缓存的操作
void testDMLToCache(){
Session s = HibernateUtil.getSession();
Transaction t = s.beginTransaction();
StudentModel tm = (StudentModel) s.get(StudentModel.class, 3L);
System.out.println(tm);
Query q = s.createQuery("update TeacherModel set teacherName=:teacherName where uuid = :uuid");
q.setString("teacherName", "测试更新1");
q.setLong("uuid", 4L);
q.executeUpdate();
t.commit();
s.close(); Session s2 = HibernateUtil.getSession();
StudentModel tm2 = (StudentModel) s2.get(StudentModel.class, 3L);
System.out.println(tm2);
s2.close();
}
//查询缓存
void testQueryToCache3(){
Session s2 = HibernateUtil.getSession();
Query q2 = s2.createQuery("from TeacherModel where uuid=:uuid");
//本次查询开启查询缓存
q2.setCacheable(true);
System.out.println(q2.list());
s2.close();
System.out.println("-------------");
Session s = HibernateUtil.getSession();
Query q = s.createQuery("from TeacherModel where uuid = 2");
q.setCacheable(true);
System.out.println(q.list());
s.close();
}
public static void main(String[] args) {
new HqlDemoApp().testQueryToCache3();
}
}
ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="d:\cache-data"/>
<cache
name="c1"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="1200"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
<defaultCache
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="1200"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
hibernate.cfg.xml
<?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>
<!--数据库连接的配置-->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/h3</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property> <!--方言的配置,用于区别使用何种数据库-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--可选配置项中,开发过程常用设置-->
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<!-- 开启二级缓存功能 -->
<property name="cache.use_second_level_cache">true</property>
<!-- 设置二级缓存供应商 -->
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <!-- 开启查询缓存 -->
<property name="cache.use_query_cache">true</property> <!-- 开启线程绑定Session -->
<property name="current_session_context_class">thread</property>
<!--资源文件注册-->
<mapping resource="cn/itcast/h3/query/hql/vo/StudentModel.hbm.xml"/>
<mapping resource="cn/itcast/h3/query/hql/vo/TeacherModel.hbm.xml"/> <!-- 二级缓存的配置(使用) -->
<!-- 类级缓存的配置 -->
<class-cache
region="c1"
usage="read-write"
class="cn.itcast.h3.query.hql.vo.TeacherModel"
/>
<class-cache
region="c1"
usage="read-write"
class="cn.itcast.h3.query.hql.vo.StudentModel"
/>
<!-- 集合缓存的配置 -->
<collection-cache
region="c1"
usage="read-write"
collection="cn.itcast.h3.query.hql.vo.TeacherModel.students"
/> </session-factory>
</hibernate-configuration>
hibernate框架学习之二级缓存(测试用例)的更多相关文章
- hibernate框架学习之二级缓存
缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...
- hibernate框架学习之一级缓存
l缓存是存储数据的临时空间,减少从数据库中查询数据的次数 lHibernate中提供有两种缓存机制 •一级缓存(Hibernate自身携带) •二级缓存(使用外部技术) lHibernate的一级缓存 ...
- Hibernate框架(四)缓存策略+lazy
Hibernate作为和数据库数据打交道的框架,自然会设计到操作数据的效率问题,而对于一些频繁操作的数据,缓存策略就是提高其性能一种重要手段,而Hibernate框架是支持缓存的,而且支持一级和二级两 ...
- Hibernate的查询,二级缓存,连接池
Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...
- Hibernate框架学习笔记
Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...
- hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...
- Hibernate学习之二级缓存
© 版权声明:本文为博主原创文章,转载请注明出处 二级缓存 - 二级缓存又称“全局缓存”.“应用级缓存” - 二级缓存中的数据可适用范围是当前应用的所有会话 - 二级缓存是可插拔式缓存,默认是EHCa ...
- hibernate框架学习第三天:对象状态、一级缓存、快照等
对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...
- [ SSH框架 ] Hibernate框架学习之二
一.Hibernate持久化类的编写规范 1.什么是持久化类 Hibernate是持久层的ORM影射框架,专注于数据的持久化工作.所谓持久化,就是将内存中的数据永久存储到关系型数据库中.那么知道了什么 ...
随机推荐
- python css功能补充讲解
###########总结#### 标签选择器 标签名 id选择器 #box1 类选择器.box2 css高级选择器 *子选择器* 子选择器用 大于号 .box1>.box2{ w ...
- jenkins笔记
java -jar jenkins.war -httpPort=9090 以9090端口启动jekins的web应用(内置jetty)
- 有关mysql的innodb_flush_log_at_trx_commit参数
一.参数解释 0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下在事务提交的时候,不会主动触发写入磁盘的操作. 1:每次事务 ...
- 理解maven命令package、install、deploy的联系与区别
我们在用maven构建java项目时,最常用的打包命令有mvn package.mvn install.deploy,这三个命令都可完成打jar包或war(当然也可以是其它形式的包)的功能,但这三个命 ...
- Eclipse使用Maven搭建Java Web项目,并直接部署Tomcat
1.环境: win10 Java 1.8 Maven 3.3.9 Eclipse IDE for Java EE Developers 2.准备: eclipse环境什么的不赘述,Maven环境还是要 ...
- 自学python 6.
内容:id() is == 编码 解码1.好声音选秀比赛评委在打分的时候可以进行输入. 假设有10个评委.让10个评委进行打分, 要求, 分数必须大于5分, 小于10分.count = 1while ...
- consul - 基础
=============================consul 是什么============================= consul 是 HashiCorp 公司推出的开源工具, 该 ...
- jqweui Picker使用一个小问题
地址:http://jqweui.com/extends#picker加了Display Value后,会产生改变值后,Picker显示Value而不显示Text情况.需要在OnClose里做如下处理 ...
- Baidu 人脸识别FireFly 与PC连接调试
1.USB线插到离屏幕较远的双层USB口上方.2.安装驱动,OK.,然后就可以直接拷贝安装包或者连接调试了. 其它几个口都不行.
- SDL 库 无法解析的外部符号 __imp__fprintf
VS2015 在链接器->命令行 里加入legacy_stdio_definitions.lib 另外一个常见错误关于stderr的用 extern "C" { FILE _ ...