那位大虾可以讲一下HIBERNATE里JCS的东东???

我看到大家说用JCS做缓存可以提高查询等性能

能详细讲解一下吗?

我想每个才入门的人都会有这样的问题,但我一直没找到
中文的说的详细的文章

最好给一个简单的小例子

我给你那个测试例子就用了JCS,就是在hbm里面加一行<jcs-cache usage="read-only"/>,然后就OK了,Iterator可以使用缓冲内的数据,List不能,它只能往缓冲里面填。cache.ccf配置文件可以配置缓冲区大小和缓冲区各项参数。

只在文档中看到JCS可以用在set, list, map, bag, array and primitive-array以及类级,方法级。我没有找到
<<Iterator可以使用缓冲内的数据,List不能,它只能往缓冲里面填<<
为什么Iterator可以,List为什么不能?

我运行你给我的例子,报错:
ERROR com.fankai.TestCatHibernate: -> Could not execute query: [IBM][CLI Driver][DB2/NT] SQL0206N "CAT0_.ID" 在使用它的上下文中无效。 SQLSTATE=42703


我看了一下Cat.hbm.xml,发现你的写法是:
<id name="id" unsaved-value="null">
<generator class=
"uuid.hex"/>
</id>
这样就可以吗?为什么不用写成这样:
<id name=
"id" type="string" unsaved-value="null" >
<column name=
"CAT_ID" sql-type="char(32)" not-null="true"/>
<generator class=
"uuid.hex"/>
</id>

我运行你给我的例子,报错:
ERROR com.fankai.TestCatHibernate: -> Could not execute query: [IBM][CLI Driver][DB2/NT] SQL0206N "CAT0_.ID" 在使用它的上下文中无效。 SQLSTATE=42703


我看了一下Cat.hbm.xml,发现你的写法是:
<id name="id" unsaved-value="null">
<generator class=
"uuid.hex"/>
</id>
这样就可以吗?为什么不用写成这样:
<id name=
"id" type="string" unsaved-value="null" >
<column name=
"CAT_ID" sql-type="char(32)" not-null="true"/>
<generator class=
"uuid.hex"/>
</id>

我知道你给我的例子里用了JCS
但我对JCS一点概念都没有
不知道在什么情况下该用它?
如果要用,该怎么用?

噢,你的程序报错的原因是因为,我把你的cat表拿过来的时候,把主键字段改成id了,而不是你原来的CAT_ID,所以你再运行就报错了,呵呵。你这样改一下就行了:

  <id name="id" unsaved-value="null">
<generator class=
"uuid.hex"/>
</id>

贴错了,帖子也没有修改功能!应该是:

 
<id name="CAT_ID" unsaved-value="null">
<generator class=
"uuid.hex"/>
</id>

robbin

我知道你给我的例子里用了JCS
但我对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总是直接从数据库取,无法利用缓冲区。

如果你不需要对结果集进行多次反复操作的话,并且考虑到在多用户并发访问的环境中,很多请求都会做同样的查询,那么用Iterator + JCS就是最合适的情况了。用法很简单,程序不需要修改,就是在hbm配置一下。

谢谢你的回复,我还有个问题

这个缓冲,是对一个对象做的缓冲,
可实际应用中,很多查询是组合了几个表后得到的一个结果集
那我该怎么缓冲它呢?

缓冲是透明的,编程的时候不用去管它。

可是你定义缓冲的时候,是写:


<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>

这是不是一个对com.fankai.Cat的缓冲??

另外你说,缓冲是对对象的缓冲,
那对于查询的结果集,并没有相应的对象,还怎么缓冲呢?

请教robbin,

这个cache.ccf文件应该存放在什么位置?和hibernate.cfg.xml在一起么?

谢谢~