二级缓存和QBC查询
来源:互联网 发布:app软件用什么编程 编辑:程序博客网 时间:2024/05/16 17:58
一、二级缓存
测试:
一级缓存:session级别缓存,在一次请求中共享数据。
二级缓存:sessionFactory级别缓存,整个应用程序共享一个会话工厂,共享一个二级缓存。
二级缓存适合存放的数据:很少被修改;不是很重要的数据, 允许出现偶尔的并发问题
二级缓存不能存放的数据:经常被修改、财务数据, 绝对不允许出现并发问题、 与其他应用数据共享的数据
类级别缓存、 集合级别缓存、时间戳缓存、查询缓存(有人称为三级缓存)
首先在hibernate.hbm.xml中开启二级缓存和选择二级缓存提供商
<!-- 开启二级缓存 project etc hibernate.properties 搜 second --><property name="hibernate.cache.use_second_level_cache">true</property><!--配置 所使用的二级缓存 选择二级缓存提供商--><property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
1、类级别缓存-类缓存区存的不是整个对象,存的是对象散列的数据-->每次取出散列数据再封装成一个对象
hibernate中添加配置
<!--配置类缓存区缓存的类类型 关于配置的位置 点在上边会有提示 --><class-cache usage="read-only" class="com.zgf.domain.Customer"/>
测试:
@Testpublic void test1()//类缓存区:把查询的对象放入类缓存区 配置文件配置{Session session = HibernateUtil.openSession();session.beginTransaction();//发送select语句到数据库,查询出的数据被封装成对象放入一级缓存,对象的散列数据放入二级缓存Customer cus=(Customer) session.get(Customer.class, 3);System.out.println(11);session.clear();//清空一级缓存,Customer对象被删除//如果没有发送select语句,说明从二级缓存获取数据//从二级缓存中取得的散列数据封装成一个新的对象,这个新的对象被放入了一级缓存中Customer cus2=(Customer) session.get(Customer.class, 3);Customer cus3=(Customer) session.get(Customer.class, 3);System.out.println(cus==cus2);//false//从一级缓存中获取的对象System.out.println(cus3==cus2);//truesession.getTransaction().commit();session.close();}2、集合缓存区--集合缓存取缓存的是id(主键),先去类缓存中根据id去查,没找见再去数据库中根据订单id查
hibernate中添加配置
<pre name="code" class="java"><class-cache usage="read-only" class="com.zgf.domain.Order"/><!-- 配置集合缓存区 缓存的集合 Customer中的orders集合,还要配置类--><collection-cache usage="read-only" collection="com.zgf.domain.Customer.orders"/>
测试:
@Testpublic void test2()//集合缓存区,{Session session = HibernateUtil.openSession();session.beginTransaction();//默认关联的订单时懒加载,不会查询,===》使用一下Customer cus=(Customer) session.get(Customer.class, 3);for(Order order:cus.getOrders()){System.out.println(order.getName());}session.clear();//从类缓存区取Customer cus2=(Customer) session.get(Customer.class, 3);//从结合缓存区取for(Order order:cus.getOrders()){System.out.println(order.getName());}Iterator<Order> ite=cus2.getOrders().iterator();while(ite.hasNext()){Order order=ite.next();System.out.println(order);}session.getTransaction().commit();session.close();}
3、查询缓存区:HQL使用的缓存区--缓存的是HQL语句(数据库支持的语句)以及查询出来id,拿着id取类缓存取类缓存区找,找不见拿着id去数据库中找
hibernate中添加配置
<!-- 开启查询缓存区 ,只开启就行了--><property name="hibernate.cache.use_query_cache">true</property>测试:
@Testpublic void test3()//查询缓存区:HQL使用的缓存区,只是开启就行了{Session session = HibernateUtil.openSession();session.beginTransaction();Query query=session.createQuery("from Customer");query.setCacheable(true);//使用二级缓存List<Customer> list=query.list();//select HQL只要查询 都会发送session.clear();//清空一级缓存Query query2=session.createQuery("from Customer c");query.setCacheable(true);//使用二级缓存List<Customer> list2=query.list();//select session.getTransaction().commit();session.close();}
4、时间戳缓存区--缓存的是表的最后操作时间
时间戳缓存区 不用配置
测试:
@Testpublic void test4(){Session session = HibernateUtil.openSession();session.beginTransaction();Customer cus=(Customer) session.get(Customer.class, 3);Query query=session.createQuery("update Customer set name:name where id=:id");query.setString("name", "heihe");query.setInteger("id", 3);query.executeUpdate();session.clear();//缓存区中数据失效了,则再次从数据库中查询Customer cus1=(Customer) session.get(Customer.class, 3);//从一级缓存取,后者从二级缓存取,数据已经失效session.getTransaction().commit();session.close();}二、QBC--面向对象的查询,不能实现连接查询,用的比较少
此处仅提供两个测试类
1、排序
@Testpublic void test1(){Session session = HibernateUtil.openSession();session.beginTransaction();Criteria cri=session.createCriteria(Customer.class);//排序cri.addOrder(org.hibernate.criterion.Order.desc("id"));List<Customer> list=cri.list();System.out.println(list);session.getTransaction().commit();session.close();}2、离线查询--不在dao层创建sql语句实现,例如在service层添加sql,但是service层木有session
DetachedCriteria 离线查询对象,不需要使用Session就可以拼凑查询条件。一般使用在web层或service层拼凑。将此对象传递给dao层,此时将与session进行绑定执行查询。
@Testpublic void test2()//QBC查询,离线查询:在service层生成创建sql语句{DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);dc.add(Restrictions.eq("id",3));//service传给dao 对象Session session = HibernateUtil.openSession();session.beginTransaction();Criteria cri=dc.getExecutableCriteria(session);Customer cus=(Customer) cri.uniqueResult();System.out.println(cus);session.getTransaction().commit();session.close();}
0 0
- 二级缓存和QBC查询
- QBC查询和本地查询
- 二级缓存和查询缓存
- QBC查询
- QBC查询
- QBC查询
- QBC查询
- QBC查询
- QBC查询
- QBC查询
- 概括Hibernate HQL和QBC查询
- hibernate学习:QBC及二级缓存
- Hibernate通常是三种:hql查询,QBC查询和QBE查询:
- Hibernate通常是三种:hql查询,QBC查询和QBE查询:
- Hibernate通常是三种:hql查询,QBC查询和QBE查询:
- hibernate二级缓存 和 查询缓存
- hibernate查询缓存和二级缓存
- Hibernate 二级缓存 和 查询缓存
- spring拦截器&过滤器&springjdbc&mybatis
- 【PAT甲级】1061. Dating (20)
- GDOI2017模拟11.3 总结
- Android产品研发(十二)-->App长连接实现
- LinearLayout和RelativeLayout绘制过程的对比
- 二级缓存和QBC查询
- 开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
- Mini-Notes: LaTex的相关工具和文档
- Android Service完全解析,关于服务你所需知道的一切(下)
- android wear那些事--添加语音功能
- 不可能的出栈序列--思想
- 机智云支持的wifi模组,Gagent模组
- TopCoder SRM 701 div1. 900 FibonacciStringSum - 矩阵乘法
- Android产品研发(十三)-->App轮询操作