Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 缓存最佳实践java_Spring_Hibernate_Caching_Jboss_Spring Cache - Fatal编程技术网

Spring 缓存最佳实践java

Spring 缓存最佳实践java,spring,hibernate,caching,jboss,spring-cache,Spring,Hibernate,Caching,Jboss,Spring Cache,我有一个基于Struts的B2B应用程序。一个页面中可能有20-25个列表框,列表框中的数据可能因客户而异。例如,列表框将是合格国家/地区列表、产品品牌列表等。一个客户下将有多个用户。在当前解决方案中,当客户下的第一个用户登录时,客户对象被设置在应用程序范围(ServletContext)中。采用这种方法是为了避免在页面加载时调用数据库 我们希望重新构建解决方案,使客户群增长50%。 新的应用程序将在带有Hibernate JPA的Spring框架上,最后应用程序将部署在JBoss集群上。 寻找

我有一个基于Struts的B2B应用程序。一个页面中可能有20-25个列表框,列表框中的数据可能因客户而异。例如,列表框将是合格国家/地区列表、产品品牌列表等。一个客户下将有多个用户。在当前解决方案中,当客户下的第一个用户登录时,客户对象被设置在应用程序范围(ServletContext)中。采用这种方法是为了避免在页面加载时调用数据库

我们希望重新构建解决方案,使客户群增长50%。 新的应用程序将在带有Hibernate JPA的Spring框架上,最后应用程序将部署在JBoss集群上。 寻找处理列表框数据的最佳缓存方法的专家意见


谢谢。

如果您的应用程序正在使用Spring,一个良好的开端是,另请参阅

设计您的模型 您需要为这些列表的内容设计一个模型,您可以直接在struts应用程序中重用这些列表。您可能不希望缓存
国家/地区
本身,但更希望缓存筛选列表,因为这可能是您获得最佳收益的地方。由于您的应用程序正在使用Hibernate,您仍然可以轻松地为这些实体创建应用程序

一旦设计好了,您就需要找到一种方法来生成一个足够好的密钥来识别应用程序的用户。可能客户的id是一个很好的候选者

创建存储库 然后,您可以创建一个存储库,根据一些参数提供这些列表的内容。理想情况下,唯一的参数是识别客户的关键,但您可以根据自己的需要调整它。例如:

public class YourRepositoryImpl implements YourRepository {

  @Cacheable("modelCache")
  public YourModel get(String customerId) {
    // compute the list for that customer. 
    // Only called if not in the cache
  }

  ...
}
这基本上指示Spring使用
get
方法的结果更新
modelCache
缓存。在这种特殊情况下,
customerId
是用于将值存储在缓存中的键。通常,如果再次调用此方法,甚至不会调用代码,因为Spring会在缓存中找到该键的条目,并直接返回值

如果无法轻松创建密钥,或者需要更多的上下文,则可以定义自定义
KeyGenerator
或指定要使用的模式

启用缓存支持 您可以通过
@EnableCaching
的XML名称空间轻松启用缓存支持。实际的缓存被委托给一个缓存实现,支持ehcache、guava、并发哈希映射和符合JSR-107的现成缓存。您可以在此阶段配置所有特定于缓存提供程序的设置:它不会影响您的代码,您甚至可以在不更改代码的情况下从一个提供程序更改到另一个提供程序

更新缓存 如果数据是只读的,那就差不多了。如果这些列表的内容发生更改,您需要处理逐出,以便再次调用
get
方法重新计算/刷新列表(请参见
@cacheexecute
),或者您可以自己更新缓存的内容(请参见
CachePut
)。您还需要配置后端缓存,以便缓存的内容在集群的所有节点上保持一致


要求特定列表已更改的逻辑可能很难实现,因此在设计模型时,您可能应该尽早关注该部分。

使用Spring cache。非常感谢你的详细建议。