2014-03-03 60 views
1

我想在使用EhCacheProvider的hibernate應用程序中配置二級緩存。 我也做了配置在hibernate.cfg.xml爲:Hibernate @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)不能正常工作

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

什麼我知道二級緩存是,如果一個對象從第二級緩存中的任何會話獲取數據庫中的第一個時間,並且如果我們嘗試從另一個會話獲取相同的對象,第二級緩存。

因此,根據測試類應該有1選擇查詢火,由休眠,但我得到2選擇查詢控制檯上。

如果我改變

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

我只得到了一個由Hibernate(預期結果)

查詢消防所以我無法理解爲什麼我得到2個選擇查詢,如果我設置CacheConcurrencyStrategy。 READ_WRITE。

我使用Hibernate 3.3.2和的Ehcache-2.8.1

在這種情況下任何光線會讚賞。

謝謝。

回答

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