2009-02-25 27 views
8

Tôi có một bộ sưu tập các trạng thái, mà tôi muốn lưu vào bộ nhớ cache cho thời gian của ứng dụng, tốt nhất là sau khi nó được gọi lần đầu tiên. Tôi đang sử dụng EclipseLink làm nhà cung cấp kiên trì của mình. Trong thực thể EJB3 của tôi, tôi có đoạn mã sau:Làm thế nào để cấu hình bộ đệm ẩn truy vấn trong EclipseLink

@Cache 
@NamedQueries({ 
    @NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
       @QueryHint(name=QueryHints.CACHE_USAGE, value=CacheUsage.CheckCacheThenDatabase), 
       @QueryHint(name=QueryHints.READ_ONLY, value=HintValues.TRUE) 
      } 
    ) 
}) 

này dường như không làm gì cả mặc dù, nếu tôi theo dõi các truy vấn SQL sẽ mysql nó vẫn không một chọn mỗi lần Session Bean của tôi sử dụng NamedQuery này.

Cách chính xác để định cấu hình truy vấn này để truy vấn đó chỉ được đọc một lần từ cơ sở dữ liệu, tốt nhất là trên tất cả các phiên?

Edit: tôi kêu gọi các truy vấn như thế này:

Query query = em.createNamedQuery("State.findAll"); 
List<State> states = query.getResultList(); 
+0

Tốt nhất của may mắn tìm ra cấu hình phiên/bộ nhớ đệm của EclipseLink. Tôi không bao giờ có thể. – cletus

Trả lời

0

Chỉ cần một đoán ở đây, nhưng bạn có thể thử

query.cacheQueryResults(); 

sau khi bạn tạo ra nó nhưng trước khi bạn getResultList.

- MarkusQ

+0

Bạn có thể giải thích về cách thức hoạt động của nó không? Đối tượng truy vấn JPA không hỗ trợ phương thức cacheQueryResults(). Nếu tôi thay vì tạo ra một ReadObjectQuery tôi không biết làm thế nào (hoặc nếu tôi có thể) yêu cầu nó cho một danh sách? – rustyshelf

+0

Nếu bạn không muốn sử dụng truy vấn eclipselink especific, bạn phải sử dụng gợi ý. Nó có thể được thực hiện thông qua chú thích, như Andre đã giải thích hoặc thông qua query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

tôi đã EclipseLink 1.0.1 bộ nhớ cache để làm việc bằng cách thêm chỉ là gợi ý truy vấn:

Query query = em.createNamedQuery("Person.find"); 
query.setParameter("NAME", name);  
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); 
return (Person)query.getSingleResult(); 

tôi không thay đổi pháp nhân ở tất cả, và chưa thử để định cấu hình bộ nhớ cache bằng chú thích.

8

Các giải pháp được đăng ở đây không hiệu quả đối với tôi. Nhưng tôi đã làm cho nó hoạt động với:

@Cache 
@NamedQueries({@NamedQuery(
     name = "State.findAll", 
     query = "SELECT s FROM State s", 
     hints = { 
      @QueryHint(name = QueryHints.QUERY_RESULTS_CACHE, value = HintValues.TRUE) 
     } 
    )}) 
+0

Chính xác, QueryHints.CACHE_USAGE là dành cho việc sử dụng bộ nhớ cache cấp thứ hai. Nếu bạn muốn bộ nhớ cache truy vấn gợi ý bạn phải sử dụng là, như Andre đã nói: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

Chú thích '@ Cache' không bắt buộc đối với truy vấn để làm việc với bộ nhớ cache – Atais

Các vấn đề liên quan