gpt4 book ai didi

java - Hibernate @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 无法相应工作

转载 作者:太空宇宙 更新时间:2023-11-04 15:04:49 25 4
gpt4 key购买 nike

我正在尝试使用 EhCacheProvider 在 hibernate 应用程序中配置二级缓存。我已经在 hibernate.cfg.xml 中完成了配置:

    <!-- Second-level cache -->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

我已将我的实体注释为:

    @Entity(name = "UserDetails")
@Table(name = "user_details")
@Cacheable(true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserDetails {

private int id;
private String userName;

public UserDetails(){}

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

@Column(name = "user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}

在我的测试课中:

    public class Test {
public static void main(String[] args){
SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Session session2 = factory.openSession();
try{
session.get(UserDetails.class, 1);

session.close();

session2.get(UserDetails.class, 1);

}catch(Exception e){
e.printStackTrace();
}finally{
session2.close();
}
}
}

我对二级缓存的了解是,如果一个对象第一次通过任何 session 从数据库获取它存储在二级缓存中,并且如果我们尝试从另一个 session 获取相同的对象,那么它会从第二级缓存中给出缓存级别。

因此,根据测试类, hibernate 应该会触发 1 个选择查询,但我在控制台上收到 2 个选择查询。

如果我改变

  @Cache(usage = CacheConcurrencyStrategy.READ_ONLY) //<-- READ_ONLY instead of READ_WRITE

我只收到一个由 hibernate 触发的查询(预期结果)

所以我无法理解为什么如果我设置 CacheConcurrencyStrategy.READ_WRITE,我会收到 2 个选择查询。

我正在使用 Hibernate 3.3.2 和 ehcache-2.8.1

任何有关此场景的说明都将不胜感激。

谢谢。

最佳答案

session 事务时间应大于缓存更新时间。更改您的代码如下 -

     public class Test {            public static void main(String[] args){                SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();                Session session = factory.openSession();                try{                    session.get(UserDetails.class, 1);                    session.close();                    Session session2 = factory.openSession();                    session2.get(UserDetails.class, 1);                }catch(Exception e){                    e.printStackTrace();                }finally{                      session2.close();                }            }        }

关于java - Hibernate @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 无法相应工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141267/

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