JCS- -
JCS就是一个通用的对象缓冲,Hibernate可以使用JCS来缓冲查询结果集。如果要对一个持久对象做缓冲,就是在hbm的class标签前面加一行:
<jcs-cache usage="read-only"/>
这是一个只读缓冲,只对Read操作做缓冲,也可以用read-write,对update也进行缓冲,不过不能用在集群环境中。
例如我的例子:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.fankai.Cat" table="cat">
<jcs-cache usage="read-only"/>
<id name="id" unsaved-value="null">
<generator class="uuid.hex"/>
</id>
<property name="name" length="16" not-null="true"/>
<property name="sex" length="1" not-null="true"/>
<property name="weight" />
</class>
</hibernate-mapping>
cache.ccf是JCS的配置文件,主要配置一下:
jcs.default.cacheattributes.MaxObjects=5000 (缓冲区容纳对象大小)
jcs.default.elementattributes.MaxLifeSeconds=240(最大缓冲时间)
除了对整个持久对象,也可以对对象的集合属性进行缓冲,那就是在property标签下面写就OK了。
第一次读取数据的时候,不论用List还是Iterator都会把数据填充到缓冲区内,以后碰到相同的查询结果,就不去数据库取,直接到JCS缓冲区取,但是只有Iterator才能去缓冲区取数据,List总是直接从数据库取,无法利用缓冲区。
>>那对于查询的结果集,并没有相应的对象,还怎么缓冲呢?<<
那就不能缓冲的。 但是一般情况下,在多层结构的J2EE应用中,是不会直接传递数值的,而是传递VO,避免网络过载,因此,就算是多表查询,你写HQL的时候,肯定会写成:
select a, b from A.class as a , B.class as b where ......;
而不会写成:
select a.id, a.name , b.sex from A.class as a, B.class as b where...;