2009-02-25 9 views
8

मेरे पास राज्यों का संग्रह है, कि मैं एप्लिकेशन के जीवन के लिए कैश करना चाहता हूं, अधिमानतः इसे पहली बार बुलाया जाने के बाद। मैं अपने दृढ़ता प्रदाता के रूप में EclipseLink का उपयोग कर रहा हूँ। मेरी EJB3 इकाई में मैं निम्नलिखित कोड है: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) 
      } 
    ) 
}) 

यह कुछ भी करने को हालांकि, अगर मैं एसक्यूएल प्रश्नों MySQL करने के लिए यह अभी भी हर बार एक का चयन मेरी सत्र बीन इस NamedQuery का उपयोग करता करता जा रहा पर नजर रखने के प्रतीत नहीं होता।

इस क्वेरी को कॉन्फ़िगर करने का सही तरीका क्या है ताकि यह केवल डेटाबेस से एक बार पढ़ा जा सके, अधिमानतः सभी सत्रों में?

संपादित करें:

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

ग्रहण लिंक के सत्र/कैशिंग कॉन्फ़िगरेशन को समझने का सबसे अच्छा भाग्य। मैं कभी नहीं कर सका – cletus

उत्तर

0

बस एक अनुमान यहाँ है, लेकिन आप

query.cacheQueryResults(); 

कोशिश को बनाने के बाद हो सकता है, लेकिन आप getResultList से पहले: मैं इस तरह क्वेरी बोल रहा हूँ।

- MarkusQ

+0

क्या आप इस बात पर विस्तार कर सकते हैं कि यह कैसे काम करेगा? जेपीए क्वेरी ऑब्जेक्ट cacheQueryResults() विधि का समर्थन नहीं करता है। यदि मैं इसके बजाय ReadObjectQuery बना देता हूं तो मुझे नहीं पता कि (या यदि मैं कर सकता हूं) इसे किसी सूची के लिए पूछूं? – rustyshelf

+0

यदि आप eclipselink especific क्वेरी का उपयोग नहीं करना चाहते हैं, तो आपको संकेतों का उपयोग करना होगा। यह एनोटेशन के माध्यम से किया जा सकता है, जैसा आंद्रे ने समझाया है या query.setHint (QueryHints.QUERY_RESULTS_CACHE, HintValues.TRUE) – Pau

0

मैं सिर्फ क्वेरी संकेत जोड़कर काम करने के लिए EclipseLink 1.0.1 कैश मिला:

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

मैं इकाई परिवर्तन नहीं किया, और अभी तक प्रयास नहीं किया है एनोटेशन का उपयोग कर कैश को कॉन्फ़िगर करने के लिए।

8

यहां पोस्ट किए गए समाधान मेरे लिए काम नहीं करते हैं। लेकिन मैंने इसे काम किया है:

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

बिल्कुल, QueryHints.CACHE_USAGE दूसरे स्तर के कैश के उपयोग के लिए है। यदि आप क्वेरी कैश चाहते हैं तो संकेत का उपयोग करना है, जैसा कि आंद्रे ने कहा था: QueryHints.QUERY_RESULTS_CACHE – Pau

+0

कैश के साथ काम करने के लिए क्वेरी के लिए '@ कैश' एनोटेशन की आवश्यकता नहीं है – Atais

संबंधित मुद्दे