2015-07-04 4 views
8

मैं अपने वसंत 4.1.4 एप्लिकेशन में नवीनतम एहैचे का उपयोग कर रहा हूं। क्या मेरे पास है:सूचियों के साथ स्प्रिंग @ कैशेबल विधियां

class Contact{ 
    int id; 
    int revision; 
}  

@Cacheable("contacts") 
public List<Contact> getContactList(List<Integer> contactIdList) { 
    return namedJdbc.queryForList("select * from contact where id in (:idlist)", Collections.singletonMap("idlist", contactIdList)); 
} 

@CachePut(value="contact", key = "id") 
public void updateContact(Contact toUpdate) { 
    jdbctemplate.update("update contact set revision = ? where id = ?", contact.getRevision(), contact.getId()); 
} 

क्या मैं हासिल करना चाहते हैं कि संपर्कों कैश में जमा हो जाती है, है, और जब मैं getContactList विधि फिर से फोन कर रहा हूँ, कि सभी संपर्क जिसका id पहले से ही कैश किया गया है से प्राप्त किए गए हैं कैश और अन्य लोगों को सामान्य रूप से पूछताछ की जानी चाहिए और फिर कैश किया जाना चाहिए। इस कैश को कैश किए गए संपर्क इकाई को अद्यतन होने पर अद्यतन करना चाहिए।

मैं सादा वसंत जेडीबीसी और एहचेचे, कोई जेपीए और कोई हाइबरनेट का उपयोग नहीं कर रहा हूं।

उत्तर

0

ऐसा नहीं लगता कि यह संभव है। List<Integer>getContactList के वापसी मूल्य के विरुद्ध कुंजी होगी कैश में सहेजा जाएगा।

इसलिए, जब तक आपके getContactList में इनपुट होने वाली आईडी की सूची में पिछले कॉल में से एक में बिल्कुल वही आईडी शामिल नहीं है, तो यह कैश मिस होगी और डेटा डीबी से प्राप्त किया जाएगा। (नोट: दो सूचियों बराबर माना जाता है कि अगर वे ठीक उसी क्रम में एक ही तत्व और होते हैं)

एक विकल्प अपने विधि getContactList(List<Integer> contactIdList)getContact(Integer id) को बदलने के लिए है - इस मामले में यह कैश निर्माण करने के लिए कुछ समय लग सकता है, लेकिन एक बार एक से संपर्क करें किसी दिए गए आईडी के लिए कैश में है, डीबी का उपयोग भविष्य की कॉल में इसे फिर से लाने के लिए नहीं किया जाएगा।

हालांकि सुरुचिपूर्ण नहीं है, लेकिन दूसरा विकल्प कैशिंग को मैन्युअल रूप से getContactList विधि में करना है।

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