दिलचस्प पोस्ट
Parse.com से 1000 से अधिक पंक्तियां कैसे प्राप्त करें? java.util.Date प्रारूप रूपांतरण yyyy-mm-dd से मिमी-dd-yyyy जावा में प्रोग्राम विंडो के एक्स और वाई कैसे प्राप्त करें? GUID बनाम INT पहचान एक पृष्ठभूमि-छवि के साथ SVG पथ तत्व भरें क्या HTML5 वीडियो फ़ुलस्क्रीन बनाने का कोई तरीका है? 'entityForName: शून्य कोई कानूनी NSManagedObjectContext पैरामीटर नहीं है – कोर डेटा पायथन पर कीबोर्ड और माउस अनुकरण करने का सबसे आसान तरीका कौन सा है? फ्लेक्स एमवीसी फ्रेमवर्क ग्रैडल (एंड्रॉइड स्टूडियो) के साथ बेहद लंबा निर्माण क्या मूल्य से पारित किया गया एरे या जावा में संदर्भ द्वारा पारित किया गया है? सामान्य ओवरलोडिंग के साथ जावा मिटाया जाना (अतिव्यापी नहीं) क्या आपके पास एक DOM तत्व की शैली ऑब्जेक्ट परिवर्तन के बाद जावास्क्रिप्ट हुक ट्रिगर हो सकता है? गिट अंतर में रेंज के लिए डबल डॉट ".. और ट्रिपल डॉट" … के बीच अंतर क्या हैं? एम्बेड करने के लिए .ttf फोंट JavaFx 2.2 है?

सीतनिद्रा में होना, @ स्यूजेन्स जनरेटर और आवंटन आकार

हम सभी को @SequenceGenerator का उपयोग करते समय सीतनिद्रा में होना के डिफ़ॉल्ट व्यवहार को जानते हैं – यह एक के द्वारा वास्तविक डाटाबेस अनुक्रम को बढ़ाता है, 50 से अधिक यह मान (डिफ़ॉल्ट allocationSize मान) – और फिर इस मान को इकाई आईडी के रूप में उपयोग करता है।

यह गलत व्यवहार और विनिर्देश के साथ संघर्ष है जो कहता है:

आवंटन आकार – (वैकल्पिक) अनुक्रम से अनुक्रम संख्या आवंटित करते समय बढ़ाई जाने वाली राशि।

स्पष्ट होना: मैं उत्पन्न आईडी के बीच अंतराल के बारे में परेशान नहीं करता।

मुझे उन आईडी के बारे में परवाह है जो अंतर्निहित डेटाबेस अनुक्रम के अनुरूप नहीं हैं I उदाहरण के लिए: किसी अन्य अनुप्रयोग (उदाहरण के लिए सादे जेडीबीसी का उपयोग करता है) अनुक्रम से प्राप्त आईडी के तहत नई पंक्तियों को सम्मिलित करना चाह सकते हैं – लेकिन सभी मान हाइबरनेट द्वारा पहले से उपयोग किए जा सकते हैं! पागलपन।

क्या किसी को इस समस्या का कोई समाधान पता है ( allocationSize=1 बिना सेट allocationSize=1 और इस प्रकार अपमानजनक प्रदर्शन)?

संपादित करें:
चीजें स्पष्ट करने के लिए अगर अंतिम सम्मिलित रिकार्ड में आईडी = 1 , तो एचबी का उपयोग 51, 52, 53... इसकी नई संस्थाओं के लिए परन्तु एक ही समय में: डाटाबेस में अनुक्रम का मूल्य 2 सेट किया जाएगा। जो आसानी से त्रुटियों की ओर ले जा सकते हैं जब अन्य अनुप्रयोग उस क्रम का उपयोग कर रहे हैं।

दूसरे हाथ पर: विनिर्देशन (मेरी समझ में) कहता है कि डाटाबेस अनुक्रम को 51 सेट किया जाना चाहिए था और इस बीच एचबी को सीमा 2, 3 ... 50 से मूल्य का उपयोग करना चाहिए

अद्यतन करें:
स्टीव एबर्सोल के रूप में नीचे उल्लिखित किया गया है: मेरे द्वारा वर्णित व्यवहार (और कई लोगों के लिए सबसे सहज भी) को hibernate.id.new_generator_mappings=true सेट करके सक्षम किया जा सकता hibernate.id.new_generator_mappings=true

आप सभी का धन्यवाद।

अद्यतन 2:
भावी पाठकों के लिए, नीचे आप एक काम का उदाहरण पा सकते हैं।

 @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ") @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS") private Long id; } 

persistence.xml

 <persistence-unit name="testPU"> <properties> <property name="hibernate.id.new_generator_mappings" value="true" /> </properties> </persistence-unit> 

वेब के समाधान से एकत्रित समाधान "सीतनिद्रा में होना, @ स्यूजेन्स जनरेटर और आवंटन आकार"

बिल्कुल स्पष्ट होने के लिए … जो आप वर्णन करते हैं वह किसी भी तरह से कल्पना के साथ संघर्ष नहीं करता है। मूल्यों के बारे में युक्ति बोलते हैं सीतनिद्रा में होना आपके संस्थाओं को प्रदान करता है, न कि मूल रूप से डेटाबेस अनुक्रम में संग्रहीत मान।

हालांकि, उस व्यवहार को पाने का विकल्प होता है जिसे आप देख रहे हैं। प्रथम पर मेरा उत्तर देखें क्या जेपीए एनोटेशन और हाइबरनेट का उपयोग करके @GeneratedValue रणनीति को गतिशील रूप से चुनने का एक तरीका है? इससे आपको मूलभूत ज्ञान मिलेगा जब तक आप उस सीकेंसस्टाइल जनरेटर का उपयोग करने के लिए सेट अप करते हैं, तब तक हाइबरनेट सीक्वेंसस्टाइल जनरेटर में "पूल ऑप्टीज़र" का उपयोग करके allocationSize आकार की व्याख्या करेगा। "पूल ऑप्टीमाइज़र" उन डेटाबेस के उपयोग के लिए है, जो अनुक्रमों के निर्माण पर एक "वेतन वृद्धि" विकल्प की अनुमति देता है (अनुक्रम का समर्थन करने वाले सभी डेटाबेस नहीं बढ़ने का समर्थन करते हैं) वैसे भी, वहाँ विभिन्न अनुकूलन रणनीतियों के बारे में पढ़ा

allocationSize=1 यह क्वेरी प्राप्त करने से पहले एक माइक्रो अनुकूलन है। हाइबरनेट आवंटन की सीमा में मूल्य निर्दिष्ट करने की कोशिश करता है और इसलिए अनुक्रम के लिए डेटाबेस को क्वेरी से बचने का प्रयास करें। लेकिन यदि आप इसे 1 पर सेट करते हैं, तो यह क्वेरी हर बार निष्पादित की जाएगी। यह शायद ही कोई फर्क पड़ेगा क्योंकि अगर आपके डेटा बेस को किसी अन्य अनुप्रयोग द्वारा एक्सेस किया गया है, तो यह समस्याएं पैदा करेगा यदि समान आईडी को किसी अन्य एप्लिकेशन द्वारा उपयोग किया जाता है।

अनुक्रम आईडी की अगली पीढ़ी आवंटन पर आधारित है आकार।

Defualt द्वारा यह 50 रूप में रखा जाता है जो बहुत अधिक है यह केवल तभी आपकी मदद करेगा, जब आपके पास एक सत्र में करीब 50 रिकॉर्ड होने की संभावना है जो कि निरंतर नहीं है और जो इस विशेष सत्र और संक्रमण का उपयोग करने में कायम रहेगा।

SequenceGenerator का उपयोग करते समय आपको हमेशा allocationSize=1 उपयोग करना चाहिए। जैसा कि अधिकांश अंतर्निहित डेटाबेस अनुक्रम हमेशा 1 बढ़ता है

हाइबरनेटेड स्रोत कोड में खुदाई करने के बाद और नीचे 50 आवेषण के बाद अगले मान के लिए ओरेकल डीबी पर विन्यास चला जाता है। इसलिए अपने INST_PK_SEQ वेतन वृद्धि 50 को हर बार कहें।

नीचे की रणनीति के लिए हाइबरनेट 5 का उपयोग किया जाता है

नीचे भी देखें http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators- परिणाम

 @Id @Column(name = "ID") @GenericGenerator(name = "INST_PK_SEQ", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = { @org.hibernate.annotations.Parameter( name = "optimizer", value = "pooled-lo"), @org.hibernate.annotations.Parameter( name = "initial_value", value = "1"), @org.hibernate.annotations.Parameter( name = "increment_size", value = "50"), @org.hibernate.annotations.Parameter( name = SequenceStyleGenerator.SEQUENCE_PARAM, value = "INST_PK_SEQ"), } ) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "INST_PK_SEQ") private Long id; 

मैं स्कीमा में अनुक्रम के लिए डीडीएल की जांच करूंगा जेपीए का कार्यान्वयन केवल सही आवंटन के आकार के साथ अनुक्रम की जिम्मेदारी है। इसलिए, अगर आवंटन का आकार 50 है तो आपके अनुक्रम में डीडीएल में 50 की बढ़ोतरी होनी चाहिए।

यह मामला आम तौर पर आवंटन आकार 1 के साथ अनुक्रम बनाने के बाद हो सकता है, बाद में आवंटन आकार 50 (या डिफ़ॉल्ट) के लिए कॉन्फ़िगर किया गया हो लेकिन अनुक्रम डीडीएल अपडेट नहीं किया गया है।

स्टीव एबर्सोल और अन्य सदस्यों,
क्या आप कृपया एक बड़ा अंतर (डिफ़ॉल्ट रूप से 50) के साथ आईडी के कारण की व्याख्या करेंगे? मैं हाइबरनेट 4.2.15 का उपयोग कर रहा हूं और ओग। Hibernate.id.enhanced.OptimizerFactory कॉस में निम्न कोड पाया।

 if ( lo > maxLo ) { lastSourceValue = callback.getNextValue(); lo = lastSourceValue.eq( 0 ) ? 1 : 0; hi = lastSourceValue.copy().multiplyBy( maxLo+1 ); } value = hi.copy().add( lo++ ); 

जब भी यह बयान के अंदर हिट हो जाता है, तो ऊंचे मूल्य बहुत बड़ा हो रहा है तो, लगातार आई सर्वर के पुनरारंभ के साथ परीक्षण के दौरान मेरा आईडी निम्नलिखित अनुक्रम आईडी बनाता है:
1, 2, 3, 4, 1 9, 250, 251, 252, 400, 550, 750, 751, 752, 850, 1100, 1150

मुझे पता है कि आपने पहले ही कहा है कि यह कल्पना के साथ संघर्ष नहीं हुआ, लेकिन मेरा मानना ​​है कि यह अधिकांश डेवलपर्स के लिए बहुत अप्रत्याशित स्थिति होगी।

किसी का इनपुट बहुत उपयोगी होगा

Jihwan

अद्यतन: ne1410s: संपादित करने के लिए धन्यवाद।
cfrick: ठीक है मै वो कर लूंगा। यह मेरी पहली पोस्ट थी और यह निश्चित नहीं था कि इसका उपयोग कैसे करना है।

अब, मैं बेहतर समझता हूं कि क्यों मैक्सएलओ का दो उद्देश्यों के लिए उपयोग किया गया था: चूंकि सीतनिद्रा में एक बार डीबी अनुक्रम एक बार कॉल करता है, जावा स्तर में आईडी को बढ़ाता है, और इसे डीबी में बचाता है, जावा स्तरीय आईडी मान को यह विचार करना चाहिए कि कॉल किए बिना कितना बदल गया था डीबी अनुक्रम जब अगली बार अनुक्रम को कॉल करता है

उदाहरण के लिए, अनुक्रम आईडी एक बिंदु पर 1 था और हाइबरनेट 5, 6, 7, 8, 9 (आवंटन के साथ = 5 =) दर्ज किया गया। अगली बार, जब हम अगली अनुक्रम संख्या प्राप्त करते हैं, डीबी 2 रिटर्न करता है, लेकिन सीतनिद्रा में होना 10, 11, 12 का उपयोग करने की आवश्यकता है … इसलिए, "hi = last sourceource.copy ()। MultiplyBy (maxLo + 1)" है डीबी अनुक्रम से लौटा 2 से एक अगले आईडी 10 प्राप्त करने के लिए इस्तेमाल किया ऐसा लगता है कि केवल परेशान बात अक्सर सर्वर के पुनरारंभ के दौरान हुई थी और यह बड़ा अंतर के साथ मेरी समस्या थी।

इसलिए, जब हम SEQUENCE आईडी का उपयोग करते हैं, तालिका में डाला आईडी डीबी में SEQUENCE संख्या से मेल नहीं खाएगा।