gpt4 book ai didi

java - 使用@Cacheable 注释的真实世界 DAO 的最佳实践

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:10 24 4
gpt4 key购买 nike

我是 Spring 的新手,我对它提供的所有功能感到非常兴奋!

现在,我正在尝试对现有项目中的几个 DAO 进行现代化改造。具体来说,我想用 Spring Jdbc 支持替换我原来的纯 JDBC 代码,并引入 Spring 的透明缓存。

  1. 第一个问题:我认为 DAO 层是添加 @Cacheable 注释的正确位置吗?还是在业务层做?

  2. 我可以按照网上找到的所有简单示例进行操作。然而,当涉及到更多真实世界代码时,我陷入了困境:

具体来说,我有几个方法可以返回我的模型 Publisher 的实例。在我的手动缓存实现中,我始终确保为不同的 getPublisher() 方法缓存和获取一个实例。但是,使用 @Cacheable 并尝试在 DAO 中封装缓存时,我遇到了问题,即注释不适用于本地方法调用(因为代理)。

这是我的示例代码:

@Cacheable("publisherCache")
public Publisher getPublisher(int publisherId)
{
String sql = "SELECT * FROM publisher LEFT JOIN publisherContacts USING (publisherId) WHERE publisherId=? ORDER BY publisherContactId ASC";
return getJdbcTemplate().query(sql, publisherResultSetExtractor, publisherId);
}

public List<Publisher> findVisiblePublishers()
{
List<Publisher> publishers = new LinkedList<Publisher>();
for (int publisherId : findVisiblePublisherIds())
{
publishers.add(getPublisher(publisherId));
}
return publishers;
}

@Cacheable(value = "publisherCache", key = "'list'")
private List<Integer> findVisiblePublisherIds()
{
String sql = "SELECT publisherId FROM publisher WHERE isVisible='yes' ORDER BY imprintName";
return getJdbcTemplate().queryForList(sql, Integer.class);
}

public Publisher findNearestPublisher(String appx)
{
appx = "%" + appx + "%";
String sql = "SELECT publisherId FROM publisher WHERE publisherName LIKE ? OR imprintName LIKE ? ORDER BY imprintName DESC LIMIT 1";
Integer publisherId = getJdbcTemplate().queryForObject(sql, Integer.class, appx, appx);
if (publisherId == null)
return null;
else
return getPublisher(publisherId);
}

这是我的想法,如前所述,行不通。

我现在能看到的唯一选择是:

a) 只缓存getPublisher(publisherId)方法,定义所有其他返回Publisher的方法返回int(publisherIds) , 或其列表。从 API 的角度来看,这并不自然。作为服务或业务逻辑,我希望从 DAO 获取实例,而不仅仅是 ID。

b) 将@Cacheable 添加到所有方法,复制缓存并使用比需要更多的内存(假设有很多发布者并且它们是重对象)。

围绕这个必须很常见 问题的最佳实践是什么?感谢您提供任何见解。

最佳答案

常见模式如下:对于持久层,您使用 hibernate 二级缓存。对于服务层,您使用 @Cacheable 来缓存诸如长计算或 Web 服务调用结果之类的东西。

关于java - 使用@Cacheable 注释的真实世界 DAO 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com