2010-11-12 4 views
41

मैं एक निश्चित परिदृश्यटाइमआउट त्रुटि h2 में तालिका लॉक करने के लिए कोशिश कर रहा

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

पर्यावरण: H2 (नवीनतम), 3.3.x

Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "USER"; SQL statement: 

[50200-144] 

    at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
    at org.h2.message.DbException.get(DbException.java:167) 
    at org.h2.message.DbException.get(DbException.java:144) 
    at org.h2.table.RegularTable.doLock(RegularTable.java:482) 
    at org.h2.table.RegularTable.lock(RegularTable.java:416) 
    at org.h2.table.TableFilter.lock(TableFilter.java:139) 
    at org.h2.command.dml.Select.queryWithoutCache(Select.java:571) 
    at org.h2.command.dml.Query.query(Query.java:257) 
    at org.h2.command.dml.Query.query(Query.java:227) 
    at org.h2.command.CommandContainer.query(CommandContainer.java:78) 
    at org.h2.command.Command.executeQuery(Command.java:132) 
    at org.h2.server.TcpServerThread.process(TcpServerThread.java:278) 
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:137) 
    at java.lang.Thread.run(Thread.java:619) 
    at org.h2.engine.SessionRemote.done(SessionRemote.java:543) 
    at org.h2.command.CommandRemote.executeQuery(CommandRemote.java:152) 
    at org.h2.jdbc.JdbcPreparedStatement.executeQuery(JdbcPreparedStatement.java:96) 
    at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:342) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1808) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:697) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.doList(Loader.java:2228) 
    ... 125 more 

उत्तर

39

हाँ, you can change the lock timeout हाइबरनेट। डिफ़ॉल्ट अपेक्षाकृत कम है: 1 सेकंड (1000 एमएस)।

कई मामलों में समस्या यह है कि एक और कनेक्शन ने तालिका को बंद कर दिया है, और बहु-संस्करण समरूपता का उपयोग करने से समस्या हल हो जाती है (;MVCC=true डेटाबेस यूआरएल में संलग्न करें)।

+0

मैं ड्राइवर यूआरएल पर समाप्ति सेट किया था, लेकिन मैं अभी भी एक ही त्रुटि मिलती है के बाद से ऊपर कार्य को पूरा करने शायद लगभग 30 सेकंड लेता है। मैं बस उन अन्य उपयोगकर्ताओं को नहीं चाहता जो इस पृष्ठ का उपयोग उस समय क्रैश देखने के लिए कर रहे हैं। क्या इसका मतलब है कि इस मुद्दे से बचने के लिए मुझे 30 सेकंड से अधिक समय पर टाइमआउट सेट करना होगा? यदि टाइमआउट बड़ी संख्या – user339108

+0

पर सेट किया गया है तो मुझे प्रदर्शन विशिष्ट समस्याएं कैसे मिलेंगी क्या लेन-देन में वास्तव में 30 सेकंड लगते हैं? यह मेरे लिए थोड़ा लंबा लगता है। क्या लेनदेन को कई छोटे लेनदेन में विभाजित करना संभव है (उदाहरण के लिए 0.5 सेकंड प्रत्येक)? –

+6

"MVCC = true" पैरामीटर का उपयोग समाधान है, टाइमआउट को बदलने से इस समस्या को ठीक नहीं किया जाता है। –

38

मुझे एक ही समस्या का सामना करना पड़ा और "एमवीसीसी = सत्य" पैरामीटर का उपयोग करके, इसे हल किया गया। आप एच 2 प्रलेखन यहाँ में इस पैरामीटर के बारे में अधिक स्पष्टीकरण प्राप्त कर सकते: http://www.h2database.com/html/advanced.html#mvcc

+1

की मदद नहीं करता है यह सही जवाब है, लॉक टाइमआउट बदलना समाधान नहीं है। –

+1

@ ब्रायनहंट यह वास्तव में निर्भर करता है। आप बस इतना कह सकते हैं कि यह आपके उपयोग के मामले का समाधान नहीं है। –

+0

@ थॉमसमुएलर क्या हमें कोई कमी है यदि हम "एमवीसीसी = सच" का उपयोग करते हैं? –

1

मैं PlayFramework

JPAQueryException के साथ इस मुद्दे मिला हुआ: समय त्रुटि models.Page से क्वेरी को निष्पादित जहां नाम =: समय समाप्त तालिका लॉक करने के लिए कोशिश कर रहा है "पृष्ठ"

यह एक तरह की एक अनंत लूप किया जा रहा समाप्त हो गया क्योंकि मैं एक

था 0

@Before

एक बिना

जब तक जिसके कारण बार-बार करने के लिए समारोह में ही फोन

@Before (जब तक = "getUser")

3

एकीकरण परीक्षणों के साथ समस्या आ रही उन लोगों के लिए (अर्थात सर्वर एच 2 डीबी तक पहुंच रहा है और एकीकरण परीक्षण सर्वर को कॉल करने से पहले डीबी तक पहुंच रहा है, परीक्षण तैयार करने के लिए), टेस्ट से पहले निष्पादित स्क्रिप्ट में 'प्रतिबद्ध' जोड़ना सुनिश्चित करता है कि सर्वर को कॉल करने से पहले डेटा डेटाबेस में है (एमवीसीसी = सत्य के बिना - जो मुझे लगता है वह थोड़ा 'अजीब' है यदि यह डिफ़ॉल्ट रूप से सक्षम नहीं है)।

5

मैं यह सुझाव देना चाहता हूं कि अगर आपको यह त्रुटि मिल रही है, तो शायद आपको अपने थोक डेटाबेस ऑपरेशन पर लेनदेन का उपयोग नहीं करना चाहिए। प्रत्येक व्यक्तिगत अद्यतन पर लेनदेन करने पर विचार करें: क्या लेनदेन के रूप में पूरे थोक आयात के बारे में सोचना समझ में आता है? शायद ऩही। यदि ऐसा होता है, तो हाँ, एमवीसीसी = सत्य या एक बड़ा लॉक टाइमआउट एक उचित समाधान है।

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

1

डीबीयूनीट, एच 2 और हाइबरनेट के साथ काम करना - एक ही त्रुटि, एमवीसीसी = सच मदद मिली, लेकिन मुझे डेटा हटाने के बाद भी किसी भी परीक्षण के लिए त्रुटि मिल जाएगी।क्या इन मामलों तय एक सौदे के अंदर वास्तविक विलोपन कोड लपेटकर था:

Transaction tx = session.beginTransaction(); 
...delete stuff 
tx.commit(); 
संबंधित मुद्दे