以线程安全的方式从数据库中读取数据

问题描述

在我的应用程序中,我有一个“Manager”类,它引用了一个 DAO 类,该类从 DB 加载数据并填充 HashMap 作为缓存解决方案。

这是一个片段

class UserManager {
   private final UserDAO userDAO;

   private final Map<Long,User> users;
   private final StampedLock lock = new StampedLock();

   public UserManager() {
     loadUsersFromDB();
   }

   // 99% of the times this method is called
   public getUserById(long id) {
      long stamp = lock.readLock();
       try {
         return users.get(id);
       } finally {
         lock.unlock(stamp);
       }
   }
 
   // This is done once when CTOR calls it and from time to time
   // by explicitly calling it from outside.
   public void loadUsersFromDB() {
 
      Map<Long,User> loadedUsers = userDAO.loadUsers();       

      long stamp = lock.writeLock();
      try {
        this.users = loadedUsers;
        
      } finally {
        lock.unlock(stamp);
      }
   }
}

这段代码在多线程环境中工作,这里的问题是在这种情况下使用 StampedLock 是一种 OVERKILL,因为大多数时间它执行 READ 操作,偶尔从 DB 和分配给班级成员。

我正在考虑删除 StampedLock 并改为使用简单的 atomicreference<Map<Long,User>>,这样大多数情况下它将是一个简单的 get,偶尔会出现 { {1}}。

你怎么看??

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)