Hibernate @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)无法正常工作

时间:2014-03-03 07:46:48

标签: java hibernate orm

我正在尝试使用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();
            }
        }
    }

我对二级缓存的了解是,如果一个对象首先从db获取它存储在第二级缓存中的任何会话,并且如果我们尝试从另一个会话中获取相同的对象,则从第二级缓存中获取缓存级别。

因此,根据Test类,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

这种情况下的任何亮点都会受到赞赏。

感谢。

1 个答案:

答案 0 :(得分:0)

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


     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();
                }
            }
        }