我一直在使用需要缓存SQL查询的分布式应用程序来处理复杂项目:因为我一直在使用iBatis框架,所以我想使用memcached - sysadmin需要它 - 作为缓存引擎。 可能吗?如果是,是否有人知道现有的解决方案/实施? 我已经知道OSCACHE也可以在集群中工作,但我想知道在切换到新的架构之前是否可以使用现有的架构。 非常感谢提前!!!
答案 0 :(得分:1)
有趣的问题!
iBatis返回一个或多个JavaBeans,而JavaBeans又可能包含嵌套的JavaBeans列表。 JavaBean只是一个遵循某些简单conventions的Java对象,其中之一就是它实现了Serializable接口。如果是,则可以将serialize JavaBean结构转换为String,并将该String反序列化为原始JavaBean结构的深层副本。
因此,我们假设您确保将所有结果对象声明为“实现Serializable”。 JavaBeans具有如此简单的结构,不需要重写默认的Java对象序列化/反序列化机制,这很好。
这些序列化字符串是您放入memcached集群的分布式哈希映射中的值。在每个运行查询并返回结果的Java方法中,首先在memcached中查找现有结果,如果 在那里并且尚未过期,则将其反序列化为JavaBeans(大概)你的查询会返回。如果查询结果在memcached中找不到 ,那么您通过iBatis查询数据库,但在返回结果之前,将其序列化为String并将该值存储在memcached中。
下一个问题是如何使用memcached查询结果 keys 。像
这样的东西YourIbatisQueryName + ":" + FirstParameterValue + ":" + SecondParameterValue
应该有效(例如,“SelectStackOverflowReputation:Simone:Tripodi”)。
你差不多完成了。最后一步是确定查询结果可以缓存多长时间而不会变为无效。也许您可以为每个查询建立不同的到期时间,或者您可能需要手动缓存失效机制。即使只持续几分钟缓存查询结果也会对应用程序的可伸缩性产生非常强烈的影响。
注意:此方法的一个变体是不使用默认的Java序列化,而是使用XML,JSON或其他格式。如果您选择XML或JSON,请查看序列化框架,如XStream,以将JavaBeans序列化/反序列化为XML字符串,然后再返回。
答案 1 :(得分:0)
扩展cacheController,但别名使用add global