gpt4 book ai didi

java - getHibernateTemplate().setCacheQueries() 应该如何正确使用?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:50:18 25 4
gpt4 key购买 nike

在我们的一些代码中,我们使用了 HibernateDaoSupport 的 setCacheQueries() 方法。起初我们有一个函数 getByGroupId() 只调用了 setCacheQueries(true),但是在进行集成测试时这导致 Hibernate 抛出“重复异常”。所以我在谷歌上搜索了一下,发现许多人使用了一种模式,他们在进行查询之前启用缓存并在查询之后禁用它。然后我尝试在查询后禁用缓存,重复错误消失了。现在我想知道这种模式到底是做什么的?下面的代码是根据此模式建模的。

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class MyDao extends HibernateDaoSupport{

public List getByGroupId(Long groupId) {
getHibernateTemplate().setCacheQueries(true);
List result = getHibernateTemplate().find(
"from Selection where groupId = ? order by sortOrder ASC", groupId);
getHibernateTemplate().setCacheQueries(false);
return result;
}
}

我不确定 Spring 和 Hibernate 在这里如何协同工作。如果 setCacheQueries(false) 会清空所有缓存的查询,那将毫无意义,但如果它只是禁用以后查询的缓存(直到 setCacheQueries(true) 被调用),它会更有意义。

  • 这种在查询前后打开/关闭缓存的模式是否正常?
  • 它是否有效(即查询是否被缓存)?
  • 知道为什么在查询后不调用 setCacheQueries(false) 时会导致 Hibernate 抛出关于重复条目的异常吗?

最佳答案

当 HibernateTemplate 的 cacheQueries 属性为真时,它会自动使每个 QueryCriteria 执行可缓存。 IE。它在执行查询/条件之前调用 Query.setCacheable(true) 和 Criteria.setCacheable(true) 。

因此,您的模式实际上包括使您将要执行的查询可缓存,然后将标志重置为 false,以便下一个查询不可缓存。

问题是,如果 HibernateTemplate 被多个线程使用,使用这种模式的结果是不确定的。您可能有一个线程将标志设置为 true,然后另一个线程在第一个线程有时间执行其查询之前立即将其重置为 false。由于对该属性的访问不同步,因此您也可能会遇到可见性问题。

我只会在创建 HibernateTemplate 时使用 HibernateTemplate.setCacheable(true),以确保它执行的所有查询都是可缓存的。如果你不想要它,那么使用两个不同的 HibernateTemplate 实例(一个启用缓存,另一个不启用),或者当你想要不同的缓存行为时直接使用 Hibernate API。

关于您的异常,在不知道用例、确切异常及其堆栈跟踪的情况下,很难诊断。

关于java - getHibernateTemplate().setCacheQueries() 应该如何正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7091618/

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