>针对模型聚合模型并附有状态数据的系统jdonframework可否有清除缓存的万能方法?
缓存清除主要难点主要是嵌套,因为我们不知道当前对象会被多少其他对象引用,这可能是一个树形结构关系,如果只靠手工,可能非常累,这就依赖缓存产品,JBossCache可以支持这种树形结构缓存清除,在EJB3中有专门的嵌套标签也是为这个目的设计的。
完全依赖JBossCache这样缓存产品来进行嵌套树形结构缓存对象更新,也有其缺点,就是可能效率低,所以,对于不是复杂的系统,手工清除又不失为一个可行的方法。
forum.isEmbedded是进行手工手工缓存清除一种方式,Form由ForumState组成,ForumState是经常更新的,所以我们设计为一个状态值对象,如果不设计这个值对象,ForumState中的字段都放在Forum中,那么更新这些字段会导致Forum这个大对象锁住,从事务性能等方面都是不好的,从Evans DDD的OO设计角度也是不对的。
》批量查询时新发的帖子并没有显示,回复某个帖子之后该帖子的所有回复也没有显示
这个问题和嵌套缓存清除没有关系,Jdon框架缓存清除分两种:
第一种是被缓存对象的清除,使用fourm.setModified(true)会导致这个缓存对象被更新,当然,直接访问缓存使用remove或clear也可以更新;被缓存对象如果有嵌套,就手工参与程度更高,见前面讨论;
第二种批量查询的结果ID集合,Jdon框架是将批量查询的结果ID进行缓存,如果需要清除,再进行新增删除动作时,考虑到会对那些批量查询结构ID集合有影响,就更新那些PageIteratorSolver.clear。
总之,缓存可以带来性能数十倍的提高,但是,没有一个通用的缓存框架能够处理所有业务对象。如果有,数据库产品就会集成进入这样的高效缓存框架,数据库为王时代会继续下去;实际上这是不可能的,因为不同的业务系统有不同形式业务模型对象,没有一个软件产品能够事先知道我们业务系统是什么样子的。
所以,我们需要对我们不同的业务应用系统,进行不同的DDD设计,提炼创造出不同的实体和嵌套其中的各种不同值对象,初期可以委托Hibernate这样的实体持久产品来管理缓存和数据库同步,但是如果要精确定位,提高缓存效率,还是需要手工介入,但是手工介入时,必须思路清晰,不能搞太复杂。
这些都和具体框架无关,是软件深层次开发遇到的必然问题,所以,不能说缓存清除的复杂是Jdon框架不能快速开发的,因为任何快速开发只是初期,包括Ruby on rails或PHP这样快速开发产品,它们的缓存处理都是粗粒度,最多做到和JBossCache差不多,EJB这样产品也是这样,它的实体Bean和HIbernate等持久层技术一样,都不能全自动而且高效解决嵌套缓存清除这个问题,Db4O这样对象数据库的主要技术衡量指标也是这个。
所以,目前没有万能的、全自动而且高效率的缓存更新方法,而且也不会有,只有更接近的答案。
>->缓存中保存的ModelA中的ModelB是一个只有ModelB主键的空对象,这个怎么理
>解?在JiveJdon3中,从ForumBuilder得到的模型都是完整的啊!
这句话可能有些问题,我现在看也没有想起,当初写这段文字目的想表述的是:ModelB如果事先首先被单独读取放入了缓存,那么ModelA中的ModelB不能在ModelA创建时再创建一个新的,这个嵌套的ModelB必须指向缓存中事先读取的那个ModelB。
如果使用HIbernate等框架,框架会帮助你解决这个细节,但是如果你使用JDBC+缓存,也就是象JJ3这样,那么就必须面临这个问题解决,JJ3提供了这样解决方案。
题外话:从这里可见:学习JJ3可以帮助初学者更灵活地掌握HIbernate深层次运用,很多程序员用HIbernate经常会半途而废,开始觉得简单,到后来觉得复杂,其实就是没有对其内部缓存机制有深入了解的原因。这也是当初EJB实体Bean难用的问题所在,现在这些喜欢“简单”程序员又去追风Ruby等,如果他们深入开发复杂业务,必然碰到这些问题,无法回避,因为不存在一个万能的缓存处理框架。
[该贴被banq于2008-02-19 11:42修改过]