如何以线程安全的方式在DAO中缓存信息

Pab*_*jim 2 java concurrency caching dao

我经常需要为一些不经常变化的参考数据实现DAO.我有时会在DAO的集合字段中缓存它 - 因此它只加载一次并在需要时显式更新.

但是,这会带来许多并发问题 - 如果另一个线程在加载或更新时尝试访问数据会怎样.

显然,这可以通过使数据的getter和setter同步来处理 - 但是对于大型Web应用程序来说,这是一个相当大的开销.

我已经包含了一个琐碎的例子,说明了我作为一个稻草人所需要的东西.请提供其他实施方法.

public class LocationDAOImpl implements LocationDAO {

private List<Location> locations = null;

public List<Location> getAllLocations() {
    if(locations == null) {
        loadAllLocations();
    }
    return locations;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,我正在使用Hibernate和Spring,但此要求适用于许多技术.

进一步的想法:

这根本不应该在代码中处理 - 而是让ehcache或类似处理吗?我缺少一个共同的模式吗?显然有很多方法可以实现,但我从未找到过简单易维护的模式.

提前致谢!

Aar*_*lla 6

最简单和安全的方法是在项目中包含ehcache库并使用它来设置缓存.这些人已经解决了您可能遇到的所有问题,他们尽可能快地建立了图书馆.