2012-04-05 9 views
13

Q1।: क्या का उपयोग करजेपीए @TableGenerator का उपयोग कर अनुक्रम आईडी के बीच क्या अंतर है, @GeneratedValue बनाम डेटाबेस Auto_Increment

CREATE TABLE Person 
(
    id long NOT NULL AUTO_INCREMENT 
    ... 
    PRIMARY KEY (id) 
) 

बनाम

बी एक डेटाबेस में लागू करने के अनुक्रम क्रमांक के बीच अंतर है

@Entity 
public class Person { 
    @Id 
    @TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME", 
     valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ") 
    @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN") 
    private long id; 
    ... 
} 

मेरे प्रणाली है अत्यधिक समवर्ती। चूंकि मेरा डीबी एक माइक्रोसॉफ्ट एसक्यूएल सर्वर है, मुझे नहीं लगता कि यह @SequenceGenerator का समर्थन करता है, इसलिए मुझे @TableGenerator के साथ रहना है जो समवर्ती मुद्दों के लिए प्रवण है।

प्रश्न 2। यह लिंक यहां (http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing) बताता है कि बी समवर्ती मुद्दों से ग्रस्त हो सकता है, लेकिन मुझे प्रस्तावित समाधान समझ में नहीं आता है। अगर कोई मुझे समझा सकता है कि बी के साथ समवर्ती मुद्दों से बचने के लिए कोई मुझे समझा सकता है।

If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.

Q2.1:: हम आवंटन कितना आकार के बारे में यहाँ बात कर रहे हैं यहाँ उनके समाधान का एक टुकड़ा है? क्या मुझे allocationSize=10 या allocationSize=100 करना चाहिए?

Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.

Q2.2: मैं अपने प्रदाता के रूप में EclipseLink का उपयोग करें; क्या मुझे उपरोक्त सुझाव देने के लिए क्या करना है?

क्यू 3। यदि बी समवर्ती मुद्दों से ग्रस्त है, तो समान है?

उत्तर

14

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

auto_increment प्रकार आपके डेटाबेस को आपकी तालिका की अगली आईडी के बारे में परवाह करेगा, यानी। डालने के दौरान डेटाबेस सर्वर द्वारा इसे स्वचालित रूप से निर्धारित किया जाएगा - जो निश्चित रूप से समेकन सुरक्षित है।

अद्यतन:

वहाँ कुछ है कि आप GenerationType.AUTO का उपयोग करने से दूर रखता है है?

जेनरेशन टाइप। ऑटो आपके इकाई के लिए आईडी पुनर्प्राप्त करने का एक उचित तरीका चुनता है। इसलिए अंतर्निहित कार्यक्षमता का उपयोग करने में सबसे अच्छे मामले में। हालांकि, आपको जेनरेट किए गए एसक्यूएल की जांच करने और देखने के लिए वास्तव में क्या होता है - क्योंकि एमएसएसएलएल अनुक्रमों की पेशकश नहीं करता है, मुझे लगता है कि यह जेनरेशन टाइप का उपयोग करेगा।

जैसा कि कहा गया है कि auto_increment कॉलम अगले आईडी मान को निर्दिष्ट करने के बारे में परवाह करता है, यानी। वहां समान सहमति नहीं है - यहां तक ​​कि समांतर में डेटाबेस से निपटने वाले कई धागे भी हैं। जेपीए द्वारा इस सुविधा को स्थानांतरित करने के लिए चुनौती है।

+0

जब आपने कहा: 'चुनौती इस सुविधा को जेपीए द्वारा उपयोग करने के लिए स्थानांतरित करना है।', क्या आप '@ जेनरेटेड वैल्यू 'के उपयोग को संदर्भित करते हैं? तो मैं तालिका 'ऑटोऑसिशन' तालिका में कॉलम सेट करने का प्रयास करता हूं, फिर मैं गुणक 'व्यक्ति' बनाने की कोशिश करता हूं। पहला व्यक्ति 'id' के साथ सही ढंग से 5 से शुरू होता है, लेकिन यह व्यक्ति 2 के लिए अपवाद उत्पन्न करता है। 'कार्य क्लोन की इकाई में शून्य या शून्य प्राथमिक कुंजी का सामना करना पड़ा'। क्या हम आईडी को '@ आईडी' के साथ' @ जेनरेटेड वैल्यू 'के बिना एनोटेट नहीं कर सकते हैं, फिर इकाई ऑब्जेक्ट को जारी रख सकते हैं, और डेटाबेस को' ऑटोऑर्डरक्रिएशन 'पीके के साथ ख्याल रखना चाहिए? –

+0

क्या आप अपना मानचित्रण दिखा सकते हैं? जेपीए कार्यान्वयन को बताने के लिए आपको '@ जेनरेटेड वैल्यू' का उपयोग करना चाहिए कि आईडी की देखभाल की जाती है। यहां जाने में आपकी सहायता करने के लिए यहां एक लिंक दिया गया है: http://www.developerscrappad.com/408/java/java-ee/ejb3-jpa-3-ways-of-generating-primary-key-through-generatedvalue/ –

11

एक: का उपयोग करता तालिका आईडी पीढ़ी

जेपीए तीन प्रकार, पहचान, अनुक्रम और टेबल का समर्थन करता है: पहचान आईडी पीढ़ी, @GeneratedValue (पहचान)

बी उपयोग करता है।

दोनों के साथ व्यापार-बंद हैं।

पहचान प्रीलोकेशन की अनुमति नहीं देती है, इसलिए प्रत्येक INSERT के बाद एक अतिरिक्त चयन की आवश्यकता होती है, बैच लेखन को रोकती है, और आईडी को एक्सेस करने के लिए फ्लश की आवश्यकता होती है जो खराब समेकन का कारण बन सकती है।

तालिका प्रीलोकेशन की अनुमति देती है, लेकिन अनुक्रम तालिका पर ताले के साथ समवर्ती समस्याएं हो सकती हैं।

तकनीकी रूप से अनुक्रम आईडी पीढ़ी सबसे अच्छा है, लेकिन सभी डेटाबेस इसका समर्थन नहीं करते हैं।

यदि आप 100 के प्रीलोकाइटन आकार का उपयोग करते हैं तो तालिका अनुक्रमण के साथ, केवल प्रत्येक 100 आवेषण अनुक्रम तालिका में पंक्ति को लॉक कर देंगे, इसलिए जब तक आपके पास आमतौर पर 100 प्रविष्टियां नहीं होंगी, तब तक आप नहीं करेंगे समेकन में किसी भी नुकसान का सामना करना पड़ता है। यदि आप आवेदन बहुत सारे आवेषण करते हैं, तो शायद 1000 या बड़े मूल्य का उपयोग करें।

ग्रहण लिंक टैबलेट अनुक्रमण के लिए एक अलग लेनदेन का उपयोग करेगा, इसलिए अनुक्रम तालिका में ताले के साथ कोई समेकन समस्या कम हो जाएगी। यदि आप जेटीए का उपयोग कर रहे हैं, तो आपको ऐसा करने के लिए एक गैर-जेटीए-डेटासोर्स निर्दिष्ट करना होगा और अपने persistence.xml गुणों में अनुक्रम-कनेक्शन-पूल कॉन्फ़िगर करना होगा।

+0

आपकी जानकारी एक प्रीलोकाइटन आकार अनुक्रमित करने के बारे में 'तालिका' मुझे बहुत मदद करता है क्योंकि मैं अपने कार्यान्वयन के लिए 'तालिका' अनुक्रम का उपयोग करने का निर्णय लेता हूं। आपको यह बक्षीस होना चाहिए, मैं यह देखने के लिए थोड़ा और इंतजार करूंगा कि किसी के पास योगदान करने का कोई अन्य विचार है, यदि नहीं, तो मैं आपको बक्षीस दूंगा। आपका बहुत बहुत धन्यवाद –

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