2013-03-05 6 views
7

मेरे पास एक बड़ी तालिका है जिसे मैं स्प्रिंग डेटा रिपोजिटरी के माध्यम से एक्सेस करना चाहता हूं।स्प्रिंग डेटा रिपोजिटरीज का उपयोग करके डेटा के बड़े सेट को कैसे संभालें?

वर्तमान में, मैं PagingAndSortingRepository इंटरफ़ेस विस्तार करने के लिए कोशिश कर रहा हूँ, लेकिन यह मैं केवल तरीकों कि वापसी सूची, उदा .:

public interface MyRepository extends 
     PagingAndSortingRepository<MyEntity, Integer> 
{ 
    @Query(value="SELECT * ...") 
    List<MyEntity> myQuery(Pageable p); 
} 

दूसरी ओर, findAll() विधि है कि PagingAndSortingRepository रिटर्न के साथ आता है परिभाषित कर सकते हैं लगता है एक Iterable (और मुझे लगता है कि डेटा स्मृति में लोड नहीं है)।

क्या कस्टम प्रश्नों को परिभाषित करना संभव है जो Iterable लौटाते हैं और/या सभी डेटा को स्मृति में एक बार लोड नहीं करते हैं?

क्या बड़ी टेबल को संभालने के लिए कोई विकल्प हैं?

+0

'सूची' 'Iterable' इंटरफ़ेस लागू करता है, इसलिए आपकी कस्टम क्वेरी विधि 'Iterable' लौटाती है। – zagyi

+0

मुझे लगता है कि जब मैं findAll() का उपयोग करता हूं, तो स्प्रिंग डेटा स्मृति में सबकुछ लोड नहीं करता है, क्या मैं गलत हूं? मैं सवाल संपादित करूंगा। –

+0

[अंतर्निहित कार्यान्वयन] (https://github.com/SpringSource/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java#L247) बस एक सूची पुनर्प्राप्त करता है, इसलिए यह परिष्कृत नहीं है। – zagyi

उत्तर

9

हमारे यहां शास्त्रीय परामर्श उत्तर है: यह निर्भर करता है। विधि के कार्यान्वयन के रूप में विशिष्ट है, हम अंतर्निहित स्टोर एपीआई पर निर्भर करते हैं। जेपीए के मामले में स्ट्रीमिंग एक्सेस प्रदान करने का कोई मौका नहीं है क्योंकि ….getResultList()List देता है। इसलिए हम ग्राहक को List का भी खुलासा करते हैं, खासकर जेपीए डेवलपर्स को सूचियों के साथ काम करने के लिए इस्तेमाल किया जा सकता है। तो जेपीए के लिए एकमात्र विकल्प पेजिनेशन एपीआई का उपयोग कर रहा है।

नियो 4j जैसे स्टोर के लिए हम स्ट्रीमिंग एक्सेस का समर्थन करते हैं क्योंकि रिपोजिटरी Iterable सीआरयूडी विधियों के साथ-साथ खोजक विधियों के निष्पादन पर वापस आती है।

+0

हाय ओलिवर, स्पष्टीकरण के लिए धन्यवाद है। मैंने अंकन सामग्री को सारणी देने के लिए एक इटरबल बनाया। यदि आपके पास कुछ समय है, तो मैं कोड/दृष्टिकोण के बारे में किसी भी प्रतिक्रिया की सराहना करता हूं। फिर से धन्यवाद :) https://gist.github.com/josericardo/5102304 –

+1

मैं आमतौर पर इस तरह की चीजों को करने की अनुशंसा नहीं करता।एक रैपर के चारों ओर हाथ रखना आसान है जो चुपचाप डेटा लाता है लेकिन आप सभी प्रकार के मुद्दों में भाग लेंगे क्योंकि आपके पास वास्तव में सत्र सीमा पर नियंत्रण नहीं है ताकि आप 'LazyLoadingException' में भाग सकें। 'पृष्ठ' तक पहुंचने में क्या गड़बड़ है, सामग्री पर पुनरावृत्ति करते हैं और दोहराते हैं कि यदि 'पृष्ठ.hasNext() 'सत्य है? यह कम से कम स्पष्ट करता है कि आपको रिपोजिटरी स्तर पर सत्र सीमाएं मिलती हैं जबतक कि आप व्यापक स्कॉप्ड लेनदेन में न हों। –

+0

प्रतिक्रिया और समय के लिए धन्यवाद :) –

2

implementationfindAll() बस सभी इकाइयों की पूरी सूची को स्मृति में लोड करता है। इसका Iterable रिटर्न प्रकार यह इंगित नहीं करता है कि यह कुछ प्रकार के डेटाबेस स्तर कर्सर हैंडलिंग लागू करता है।

दूसरी तरफ आपकी कस्टम myQuery(Pageable) विधि केवल एक पृष्ठ की इकाइयों को लोड करेगी, क्योंकि जेनरेट किए गए कार्यान्वयन को Pageable पैरामीटर का सम्मान मिलता है। आप इसके रिटर्न प्रकार को Page या List के रूप में घोषित कर सकते हैं। बाद के मामले में आपको अभी भी एक ही (प्रतिबंधित) इकाइयों की संख्या मिलती है, लेकिन मेटाडेटा नहीं है कि Page अतिरिक्त रूप से ले जाएगा।

तो आपने मूल रूप से सही कार्य किया है ताकि सभी इकाइयों को आपकी कस्टम क्वेरी में स्मृति में लोड करने से बचें।

कृपया related documentation here की समीक्षा करें।

+0

दूसरा लिंक टूटा हुआ है। अब यह https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.special-parameters – kolobok

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