当前位置: 首页 > 知识库问答 >
问题:

我是否正确使用了@Cacheable、@CachePut和@cacheexecute?

施赞
2023-03-14

在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。

我是这样做的(如下),但我不知道我是否做对了。

我在想@Cacheable使得它只运行一次,并且所有其他时间的值都将从缓存中加载。

saveUser上的@cacheexecutedeleteUser会在发生更新或删除时清除缓存。

那是正确的吗?如果是,什么时候使用@CachePUT合适?

@Component
public class UserDAOImpl implements UserDAO {

    @Cacheable("users")
    public List<User> getAllUsers() throws Exception {
      /* ... loads then returns all user from the database ...*/
    }

    @Cacheable("users")
    public Datasource getUser(Integer userId) throws NoResultException, Exception {
      /* ... loads and returns the specified user from the database ...*/
    }

    @CacheEvict(value="users")
    public Integer saveUser(UserDTO userDTO) throws Exception {
      /* ... disassembles the userDTO and writes it to the database, return the user id ... */
    }

    @CacheEvict(value="users")
    public void deleteUser(Integer userId) throws Exception {
      /* ... deletes the user by userId ... */
    }

}

共有1个答案

左丘边浩
2023-03-14

如本文所述,缓存就像一个映射

在删除语句中使用@CacheEvket(...)是正确的。

@CacheEvict(value = 'user', key = "#id")
public void deleteUser(...)

因此,这里的目标是删除用户。不仅来自持久层,还来自缓存。请注意这里的参数要小心。

但是,在保存用户时,应使用@CachePut(…) 取而代之。

@CachePut(value = 'user', key = "#id")
public User saveUser(Integer id, UserDTO userDTO)

也就是说,始终执行该方法,并将其结果放入缓存(根据@CachePut(…) 选项)。这里有更多信息。

 类似资料:
  • 问题内容: 我在源代码下找到了以下文档 CachePut批注不会导致目标方法被跳过-而是总是导致该方法被调用并将其结果放入缓存中。 这是否意味着如果使用,updateCustomer方法将仅执行一次,结果将在缓存中更新。随后对updateCustomer的调用将不会执行updateCustomer,而只会更新缓存。 在的情况下,方法将在每次调用时执行,结果将在缓存中更新。 我的理解正确吗? 问题答

  • 使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。

  • 问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这

  • 我正在从下面的方法中获取电影列表,并带有@Cacheable注释。由于它没有任何参数,我将key设置为#root.method.name。 现在,我想添加一个新的电影,同样应该添加到上述缓存。 我试过这个,但它给了我例外。 我们可以在这里使用@CachePut注释,还是有其他方法?

  • (Spring的@CachePut注释是否适用于void返回类型?) 我遇到了同样的问题 因为这个问题已经存在很长时间了,我不知道是否有解决办法 创建缓存: 使用@CachePut更新此缓存 输出: 我搜索了几天信息,但没有找到答案 除了使用@CacheEvict(cacheNames=userCache,allEntry=true) 有没有办法用@Cacheable和@CachePut解决? 非

  • 问题内容: 由于对设计模式和体系结构不熟悉,我很难向他人确切说明我的最新应用程序是如何设计的。我已经在认为它是纯n层,纯MVC和表示层中具有MVC的n层之间切换。目前,我认为后者是正确的,但我希望更多有经验的开发人员能有所作为。 浏览器将HTTP请求发送到Tomcat。通过web.xml将请求映射到servlet(我称为控制器) 控制器实例化一个或多个业务对象并在其上调用方法,即,该对象将在调用一