我应该在Spring MVC Web应用程序中对DAO层或服务层进行缓存吗?

时间:2013-03-14 21:22:54

标签: java caching spring-mvc

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

E.g。我在服务层上有这个方法:

@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层上进行缓存吗?

2 个答案:

答案 0 :(得分:7)

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

其次,如果你进行缓存,在可能的情况下使用第三方框架,如EHCache等(是的,即数据层)

第三,在您的示例中,您的方法签名让我觉得您不太可能多次获得相同的请求。当您收到getOrderCount(January 27, January 28, String)的请求时,将答案存储到getOrderCount(March 21, March 28, Vector)将无济于事。除非有一些值可能会对您的业务逻辑提出很多要求,并且计算结果足够重,否则缓存(如果有的话)应该进入数据层。

答案 1 :(得分:3)

如果您正在进行更多情境感知缓存,我认为缓存适合服务层。例如,支持乐观锁定查询结果,该查询结果可以由Web服务API或Etag支持进行分页。这假设采用直接缓存方法(不是声明),例如直接使用EhCache。

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