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