Java 分布式web应用程序中的缓存-复杂查询用例

Java 分布式web应用程序中的缓存-复杂查询用例,java,mysql,sql,spring,caching,Java,Mysql,Sql,Spring,Caching,我们正在开发一个分布式web应用程序(3个带有负载平衡器的Tomcat) 目前,我们正在寻找缓存解决方案。当然,这个解决方案应该是集群安全的。 我们正在使用spring,jpa(mysql) 我们考虑了以下解决方案: 创建一个运行简单缓存的缓存服务器,来自每个tomcat的所有DB操作都将委托给它。(web应用程序中的dao层将与该服务器通信,而不是访问数据库本身)。这很有吸引力,因为缓存服务器配置上的缓存可以是最小的 我们现在想知道的是: 如果将复杂查询传递给cacheServer(即使用多个

我们正在开发一个分布式web应用程序(3个带有负载平衡器的Tomcat)

目前,我们正在寻找缓存解决方案。当然,这个解决方案应该是集群安全的。 我们正在使用spring,jpa(mysql)

我们考虑了以下解决方案:

创建一个运行简单缓存的缓存服务器,来自每个tomcat的所有DB操作都将委托给它。(web应用程序中的dao层将与该服务器通信,而不是访问数据库本身)。这很有吸引力,因为缓存服务器配置上的缓存可以是最小的

我们现在想知道的是:

如果将复杂查询传递给cacheServer(即使用多个联接和where子句进行选择),那么标准缓存表单(map)如何准确地处理此问题?这是否意味着我们必须单独为每个复杂查询实现一个查找,并将其调整为映射搜索而不是DB

另外,这种架构的基础可能存在缺陷,因此提出了一个类似这样的奇怪问题,如果是这样的话,请提出替代方案


最好的情况是,

mySql已经提供了一个查询缓存,请参见

如果我理解正确,您正在尝试实现一个方法缓存,将DAO方法的参数作为键,并将结果对象/列表作为值

这应该是可行的,但您对复杂查询的关注是有效的,最终会在缓存中出现大量条目。对于复杂查询,只有在使用与缓存中的参数完全相同的参数执行同一查询时,才会命中缓存。您必须弄清楚缓存这些复杂查询是否有用,如果它们有可能被命中,这实际上取决于应用程序的业务逻辑

另一种选择是使用ehcache和大内存实现具有多个级别的缓存:二级缓存和查询缓存。您可能会发现这很有用: