2009-07-30 20 views
7

मैं डेटाबेस एप्लिकेशन पर काम कर रहा हूं जो ज्यादातर पढ़ने के लिए है, लेकिन एक टेबल है जो ऐप में उपयोगकर्ता आंदोलन रिकॉर्ड करती है और इसमें बड़ी संख्या में लिखते हैं। के लिए हर कुछ हजार लिखते हैं, हम तो जैसे त्रुटि लॉग में कुछ अपवादों को छोड़कर देखें:हाइबरनेट से डुप्लिकेट प्रविष्टि त्रुटियां प्राप्त करना, MySQL को दोष देना है?

[WARN][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] SQL Error: 1062, SQLState: 23000 
[ERROR][2009-07-30 11:09:20,083][org.hibernate.util.JDBCExceptionReporter] Duplicate entry '17011' for key 1 
[ERROR][2009-07-30 11:09:20,083][org.hibernate.event.def.AbstractFlushingEventListener] Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 

प्रश्न में तालिका निम्न स्कीमा है:

CREATE TABLE IF NOT EXISTS `my_table` (
    `id` int(11) NOT NULL, 
    `data1` int(11) NOT NULL, 
    `data2` int(11) NOT NULL, 
    `timestamp` datetime default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; 

और इसी हाइबरनेट मानचित्रण एक्सएमएल:

<hibernate-mapping> 
    <class name="mycorp.MyClass" table="my_table"> 
    <id name="id" column="id" type="java.lang.Integer"> 
     <generator class="increment"/> 
    </id> 
    <property name="data1" column="data1" type="java.lang.Integer"/> 
    <property name="data2" column="data2" type="java.lang.Integer"/> 
    <property name="timestamp" column="timestamp" type="java.util.Date"/> 
    </class> 
</hibernate-mapping> 

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

वैसे भी, मुझे विश्वास नहीं है कि यह समस्या है, लेकिन मुझे संदेह है कि यहां MySQL और Hibernate के बीच कुछ सिंक्रनाइज़ेशन समस्या है। अनुक्रम, seqhilo या हिलो मदद करने के लिए मेरे जनरेटर बदलना होगा? इसके अलावा, यदि आप MySQL में ऐसे जनरेटर को स्थापित करने का एक उदाहरण प्रदान कर सकते हैं, तो यह बहुत उपयोगी होगा, क्योंकि ऑनलाइन संसाधनों में से अधिकांश केवल हाइबरनेट मैनुअल में दुःखद सरल उदाहरणों से कॉपी-पेस्ट किए जाते हैं।

उत्तर

9

यदि आपके पास एक ही तालिका में एक से अधिक प्रक्रिया लिखने की वृद्धि है तो वृद्धि निश्चित रूप से खराब है - आप टकराव करने के लिए बाध्य हैं।

चूंकि यह MySQL है, हम इस बारे में बात कर रहे हैं, उपयोग करने की सबसे आसान चीज़ identity होगी।

<generator class="identity"/> 

अपने MySQL स्क्रिप्ट में: अपने हाइबरनेट मानचित्रण में

CREATE TABLE IF NOT EXISTS `my_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `data1` int(11) NOT NULL, 
    `data2` int(11) NOT NULL, 
    `timestamp` datetime default NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci; 

एक मौजूदा टेबल को बदलने के लिए:

ALTER TABLE `my_table` 
    CHANGE COLUMN `id` `id` int(11) NOT NULL AUTO_INCREMENT=$NEW_VALUE$; 

जहां $ NEW_VALUE $ अगले उपलब्ध आईडी द्वारा प्रतिस्थापित किया जाना चाहिए ताकि वह अनुक्रम 1 पर रीसेट नहीं होता है।

+0

बहुत गहन और स्पष्ट उत्तर - धन्यवाद! –