1

我们使用 Grails 和 Groovy 构建了一个大型保险单和索赔管理系统。性能问题正在减慢站点速度,因为所有“READS”都从数据库中获取,这不是必需的,因为大多数数据都是静态的。我们想在 Grails 层中引入一个简单的键/值缓存,但我们不想用 cache.get() 和 cache.set() 代码乱扔现有代码,我们想改用方面。

这是我们主控制器的示例....

InsuranceMainController {
  def customer {
    //handles all URI mappings for /customer/customerId
  }

  def policy {
    //handles all URI mappings for /policy/policyId, 
  }

  def claim {
    //handles all URL mappings for /claim/claimId
  }

就缓存而言,暂时假设它是一个名为“缓存”的简单 Map,可用作全局范围的对象,并且缓存中的对象由请求 URI 键控...

cache.put("/customer/99876", customerObject)
cache.put("/policy/99-33-ARYT", policyObject) 

回到控制器,如果我们只是用 cache.get()/set() 乱扔代码,这是我们想要避免使用 Spring AOP 的,我们最终会得到混乱的代码。我们希望通过 apsect 实现以下功能,或者仅通过更简单、更清晰的实现......

InsuranceMainController {
  def customer {

    Object customer = cache.get(request.getRequestURI())
    if ( customer != null)
       //render response with customer object
    }else
       //get the customer from the database, then add to cache
       CustomerPersistenceManager customerPM = ...
       customer = customerPM.getCustomer(customerId)
       cache.put(request.getRequestURI(), customer)
    }
  }

我们需要一些例子来展示我们如何使用 Spring AOP 或 Grails 中更简单的东西来实现上述功能,同时避免使用 cache.get()/set() 乱写代码。如果需要使 AOP 正常工作,欢迎提出重构现有控制器的建议。

提前致谢

4

1 回答 1

2

除了使用 AOP,您可以调整Paul Woods 先生的控制器简化模式,将缓存处理移到单个方法中?

像这样的东西可能会起作用:

class InsuranceMainController {

  def customer = {
    Object customer = withCachedRef( 'customerId' ) { customerId ->
       CustomerPersistenceManager customerPM = ...
       customerPM.getCustomer(customerId)
    }
  }

  def policy = {
    //handles all URI mappings for /policy/policyId, 
    Object policy = withCachedRef( 'policyId' ) { policyId ->
       PolicyPersistenceManager policyPM = ...
       policyPM.getPolicy(policyId)
    }
  }

  // ...

  private def withCachedRef( String id, Closure c ) {
    Object ret = cache.get( request.requestURI )
    if( !ret ) {
      ret = c.call( params[ id ] )
      cache.put( request.requestURI, ret )
    }
    ret
  }
}

但是,我根本没有测试过它:-(只是AOP替代方案的建议

于 2011-12-05T16:15:21.397 回答