二级缓存和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
原创粉丝点击