11

我想在我的 Spring MVC Web 应用程序中缓存数据。因为我也是 Spring Framework 和 MVC 架构的新手,所以我想问一下我应该在 DAO 层缓存数据(通过Spring Caching system)还是应该在服务层缓存输出方法?

例如,我在服务层上有这个方法:

@Override
public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type) {
    try {
        return chartDataDAO.getOrderCount(dateFrom, dateTo, type);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

这个方法调用这个 DAO 方法:

public LinkedList<OrderCount> getOrderCount(Date dateFrom, Date dateTo, Class type);

我的问题是:我应该在服务层还是 DAO 层上进行缓存?

4

2 回答 2

7

首先,不要超前。在缓存之前,请确保您需要它。缓存可以提高性能,但会带来一系列令人头疼的问题(主要是由于失去数据一致性)。

其次,如果您进行缓存,请尽可能使用 EHCache 之类的第三方框架(是的,这就是数据层)

第三,在您的示例中,您的方法签名使我认为您不太可能多次收到相同的请求。当getOrderCount(January 27, January 28, String)您收到getOrderCount(March 21, March 28, Vector). 除非您的业务逻辑可能需要很多值,并且计算结果足够重,否则缓存(如果有)应该进入数据层。

于 2013-03-14T21:29:57.673 回答
3

如果您正在执行更多上下文感知缓存,我认为缓存适合服务层。例如对查询结果的乐观锁定支持,该查询结果可以由 Web 服务 api 或 Etag 支持分页。这假定了直接缓存方法(非声明性),例如直接使用 EhCache。

如果您使用 Spring 声明式缓存来尝试一些全面的性能改进,您可能会发现在 DAO 层中缓存方法很有用。我不确定这是否会比可能已经用您的 ORM 实现的缓存提供任何好处 - 例如,休眠支持各种缓存级别以提高数据库的性能。

于 2013-04-02T19:14:15.777 回答