在缓存中检索数据的方式大讨论

         
tianhaoleng
09-07-22 4 673

抛弃了数据库,把对象加载到了缓存中,困难重重。

其中主要的一个问题是对缓存中的对象进行检索、筛选的问题。

以前这个问题是由数据库提供的SQL语言解决的,但是现在对象在缓存中,而检索缓存中的对象并没有一种类似于SQL语言的检索方式。

如果谁能解决这个问题,就等于得发明一套新的语言。

我想问下各位,是怎么处理我提出的问题的。

banq
2009-07-22 16:42

这个已经通过Specification模式实现,检索查询其实是一种规格约束的输出,所以,在DDD中,检索查询被认为是Specification模式实现的一个功能。

所以,Specification模式是很厉害,很强大,NGOSS中有专门的约束Specification模式推荐。

通过Specification模式可以发挥全文检索和数据库检索的综合能力,而且与客户端使用耦合。

现在我们很多查询都是直接和SQL耦合,这样,如果使用全文检索,或者最新的数据检索技术,程序必须重新写。

SQL在OO软件中属于一种设计的能力实现,而不是设计本身。这个问题实质也是设计模式和算法的问题。设计模式和算法位置和关系搞清楚,就自然对对象缓存和数据库的定位很清楚了。

tianhaoleng
2009-07-23 09:29

我去查了下规格模式,的确很有用。
但是使用它有一个限制,那就是必须使用集合来存储领域根聚合。

而我目前的做法是把根聚合对象直接存放在缓存中。

对于缓存,是不支持遍历的,因此,规格模式在缓存中做对象的筛选没有技术基础。

当然我可以把某种类型的根聚合对象组装为一个集合,然后存入缓存,但是这样,缓存中的一个KEY引用的集合对象会很大,假如分布式的话,从缓存中查出这样一个大集合,网络传输是不可想象的。比如MEMCACHED这种分布式缓存,就要求其一个单独对象的大小不要超过1M。

另外,从集合中根据KEY来查询单个对象也是困难的,几乎每次查询,都会带来遍历集合的开销。

我的问题是,从缓存中条件查询,没有任何技术作为基础,仅仅有理论是不能够实现的。

BANQ在做缓存对象查询时,采用的技术基础是什么呢

banq
2009-07-23 09:39

结合criteria pattern实现,不过这要花些心思,Hibernate criteria 做得不错,尽量使用criteria ,不要用HQL。

Specification模型设计 + criteria 模式,可以用对象化方式解决大部分SQL查询。

我在JiveJdon中用了一些,但可能不太好,有改进余地。
[该贴被banq于2009-07-23 09:40修改过]

bloodrate
2009-07-29 09:30

用HSQLDB作缓存如何?还支持sql查询?