JCS(
Java Caching System)是一个对象Cache,它可以把Java对象缓存起来,提高那些访问频率很高的Java对象的存取效率。JCS是按照对象的唯一标示来存取对象的,比如说可以按照对象的hashCode来存取。
对于Hibernate来说,可以利用JCS来缓存查询结果,这样当下次访问同样的数据,就无须去数据库取,直接从JCS中取出来,加快了查询速度。
当Hibernate使用List或者Iterator方式来第一次读取数据的时候,JCS是空的,此时不管是List方式还是Iterator方式都会往JCS里面填充查询出来的持久对象,例如:
select c from Cat as c
而
select c.id, c.name from Cat as c
这种HQL语句不构造PO,因此不会去填充JCS。
好了,现在JCS里面填好了数据,但是该怎么取呢?上面我说过是按照对象的唯一标示来存取的,而对于PO持久对象来说,唯一标示就是主键,因此Hibernate首先必须获得主键列表,然后根据主键列表挨个判定,看这个持久对象究竟是在JCS里面还是在数据库里面,假如在JCS里面,那么按照主键取,假如在数据库,那么发送sql取。
现在我们来分析为什么Iterator可以使用JCS,
而List不能。上面说了,用JCS之前,要先获得持久对象的主键,才能去JCS里面取持久对象,而我们怎么才能获得主键列表呢?必须去数据库中取得,这一步是没有办法缓冲的。
Hibernate Iterator的查询本身是分为两步的:
==> select id from cat
==> select * from cat where id = ?
==> select * from cat where id = ?
...
==> select * from cat where id = ?
第一步,去数据库中取主键列表,第二步,按照主键一个一个取数据。当然了,我们现在可以看出来,Iterator方式下假如不用JCS的话,那么从数据库中取出n条记录就需要n+1次sql查询,这是非常可怕的事情,因此假如在没有使用JCS的情况下,你又必须一次去取大量数据,应该避免使用Iterator。
而Iterator的第一次sql是取主键列表,这个时间消耗是非常少的,假如使用了JCS,那么每次查询仍然要不可避免的去发送一次sql: select id from cat 去取主键列表,然后呢? 然后Iterator就不会那么傻了,他会先到JCS里面去看看,按照主键去找持久对象,假如有了,直接拿出来用,假如没有,那么只好去数据库中取得,然后再把它填到JCS里面去。
因此可以看出来,JCS有点类似一个内存中的简单对象数据库,
Iterator的第一次sql取主键列表是必须要到数据库里面取的,取得了主键这把钥匙以后,Iterator会首先尝试开JCS这把锁,打得开就直接进去,假如打不开,就只好去开数据库这把锁了。
而
Hibernate List方式是JDBC的简单封装,一次sql就把所有的数据都取出来了,它不会像Iterator那样先取主键,然后再取数据,因此List无法利用JCS。不过List也
可以把从数据库中取出的数据
填充到JCS里面去。
最佳的方式:第一次访问使用List,快速填充JCS,以后访问采用Iterator,充分利用JCS。
mikeho write:
那JCS是如何和Database保持同步的?
robbin write:
jcs.default.elementattributes.MaxLifeSeconds=240(最大缓冲时间)
超时做作废,另外你在程序里面也可以clear JCS cache
分享到:
相关推荐
Hibernate中的query 博客分类: • Hibernate HibernateSQLSQL ServerMySQLJDBC Hibernate中的query.setFirstResult(),query.setMaxResults(); 一、query.scroll()和query.setFirstResult(),query....
java 1. 泛型 2. 队列 3. 栈 4. Iterator 和 ListIterator迭代器
Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); } Map map =...
java-util-iterator.pdfjava-util-iterator.pdfjava-util-iterator.pdf
"C++ STL 库函数总结" C++ STL 库函数总结是指 C++ 标准模板库...C++ STL 库函数总结中的集合(set)部分提供了一个强大的工具,用于解决实际问题。其成员函数和迭代器使得开发者可以方便地操作集合中的元素。
例1: 生成一个简单的iterator,并且使用iterator标签打印出内容。 <s:generator val="%{'aaa,bbb,ccc,ddd,eee'}"> <s:iterator> <s:property /> </s:iterator> </s:generator> 例2: 生成一个iterator,...
com.javapatterns.iterator 迭代子模式 com.javapatterns.javaio 专题:设计模式在Java I/O中的应用 com.javapatterns.keygen 专题:序列键生成器与单例及多例模式 com.javapatterns.liskov 里氏代换原则 ...
java lru leetcode Leetcode Just want to push myself to ...里面并没有列出所有的题目的解法,只列出一些比较经典的 ...n ...1 1. ...O(n) ...O(n) ...O(1) ...1. ...O(n) ...O(log(n!...1. ...O(n), ...iterator + stack Time: O(n),
计算机后端-Java-Java核心基础-第24章 集合01 11. Iterator迭代器remove()的使用.avi
计算机后端-Java-Java核心基础-第24章 集合01 10. Iterator遍历集合的两种错误写法.avi
例子2-1: import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int age; ...
core-js版本问题,下载最新版本core-js即可。 解决过程: 1、查看node_modules下没有core-js,于是安装npm i core-js@2,还是报错!! 2、再查看node_modules下的core-js,里面确实没有es.array.iterator.js。 3、...
3.24.1 Vector Instead of Array..... . . . 123 3.24.2 String Instead of char*..... . . . 124 3.25 Software Engineering: Program Correctness.... 124 3.26 Dr. P’s Prescriptions....... . . 127 3.27 C++ ...
使用JSONObject, JSONArray的全套完整jar包,绝对... Iterator<Object> it = jsonArr.iterator(); while(it.hasNext()){ String ff = (String)it.next(); System.out.println("获取的是:"+ff); } } }
软件设计模式是解决软件设计问题的一种方法,旨在提高软件系统的灵活性、可维护性和可重用性。软件设计模式可以分为三类:创建型模式、结构型模式和行为型模式。 创建型模式 创建型模式主要用于创建对象。常见的...
一个运用Extjs,Struts2, json,iterator技术构建的iterator_jsonDemo2。iterator_jsonDemo1的链接:http://download.csdn.net/detail/cafebar123/8816409 运用了Extjs,Struts2, json,iterator技术, 将数据从...
Triangular类,包含对Triangular类的提领操作Triangular_iterator类,以及异常类iterator_overflow。 输入输出样例为: (3,6) Triangular Series of 6 elements 6 10 15 21 28 36
迭代器模式(Iterator)C++实现
java重量级源码 精灵 0.6.10 " ..." %% " geny " ...基于推送的scala.Iterator[T]版本 ...这对于使用Generator对来自文件或其他需要清理的源的流数据进行建模非常有用:最常见的替代方案scala.Iterator无法保证文
Iterator<Article> in1 = alist1.iterator(); List<Article> alist2 = (List)request.getSession().getAttribute("alist2"); Iterator<Article> in2 = alist2.iterator(); List<Article> alist3 = (List)...