我一直在做一个使用分布式应用程序的复杂项目,它需要缓存SQL查询:因为我一直在使用iBatis框架,所以我想使用memcached - sysadmin请求它-作为缓存引擎。有可能吗?如果是,是否有人知道现有的解决方案/实现?我已经知道OSCACHE在集群中也可以工作,但在切换到新的架构之前,我想知道是否可以使用现有的架构。非常感谢!
发布于 2009-06-01 04:25:44
有趣的问题!
iBatis返回一个或多个JavaBeans,后者可能包含嵌套的JavaBeans列表。Serializable就是一个遵循某些简单conventions的JavaBean对象,其中之一就是它实现了Serializable接口。如果是这样的话,您可以将JavaBean结构serialize为字符串,然后将该字符串反序列化为原始JavaBean结构的深层副本。
因此,假设您确保所有的result对象都被声明为“实现Serializable”。JavaBeans具有如此简单的结构,不需要覆盖默认的Java对象序列化/反序列化机制,这很好。
这些序列化的字符串是您放入memcached集群的分布式散列映射中的值。在运行查询并返回其结果的每个方法中,首先在memcached中查找现有结果,如果它在memcached中且尚未过期,则将其反序列化为(假设)查询将返回的JavaBeans。如果在memcached中没有找到查询结果,那么可以通过iBatis查询数据库,但是在返回结果之前,需要将其序列化为一个字符串,并将该值存储在memcached中。
下一个问题是使用什么作为memcached查询结果键。就像这样
YourIbatisQueryName + ":" + FirstParameterValue + ":" + SecondParameterValue应该起作用(例如,"SelectStackOverflowReputation:Simone:Tripodi").
你就快完成了。最后一步是确定查询结果可以缓存多长时间而不会变得无效。也许您可以为每个查询建立不同的过期时间,或者您可能需要一种手动缓存无效机制。即使只缓存几分钟的查询结果,也会对应用程序的可伸缩性产生非常大的影响。
注意:这种方法的一个变体是不使用缺省的Java序列化,而是使用XML、JSON或其他一些格式。如果您选择XML或JSON,那么可以研究像XStream这样的序列化框架,将JavaBeans序列化/反序列化成XML字符串,然后再反序列化。
发布于 2010-01-21 16:08:10
扩展全局,但别名使用add cacheController
https://stackoverflow.com/questions/835849
复制相似问题