2012-04-02 9 views
18

यह post से संबंधित है।
मुझे लगता है कि मुझे H2 के साथ समस्या है जिसका अर्थ है कि यह ठीक से बंद नहीं होता है।
मुझे संदेह है क्योंकि मैं myDB.lock.db देखता हूं जब मैं टोमकैट बंद करता हूं और प्रक्रिया बंद नहीं होती है।
मैं उपयोग बिलाव के कनेक्शन पूलिंग और डेटाबेस के लिए यूआरएल है:
url="jdbc:h2:file:/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase;SCHEMA=myschema"एच 2 बंद करने का सही तरीका क्या है?

डॉक close H2 से:

आमतौर पर, एक डेटाबेस बंद कर दिया है जब यह करने के लिए पिछले कनेक्शन बंद कर दिया है .. .. डिफ़ॉल्ट रूप से, अंतिम कनेक्शन बंद होने पर डेटाबेस बंद हो जाता है। हालांकि, अगर इसे बंद कर दिया कभी नहीं है, डेटाबेस बंद कर दिया जब आभासी मशीन सामान्य रूप से बाहर निकल जाता है, बंद हुक

का उपयोग कर अगर मैं कुछ गलत कर रहा हूँ मैं नहीं समझ सकता है।
क्या मुझे डेटाबेस को कमांड के माध्यम से बंद करने के लिए मजबूर होना चाहिए? क्या यह शट डाउन हुक का अर्थ है?
मैं यहाँ क्या गलत कर रहा हूं?

नोट:
मैं गूगल में कैसे H2 बंद करने के लिए ठीक से (बयान है कि यह पिछले कनेक्शन शटडाउन होने पर स्वत: बंद हो के अलावा) का एक उदाहरण नहीं मिल सकता है। क्या मुझे खुद को SHUTDOWN पर कॉल करना चाहिए? क्या यह उचित दृष्टिकोण है?
मैं पहले से ही सवाल बंद करने के लिए वोट देखना लेकिन वहाँ एक कारण या मैं क्या कर रहा हूँ की जांच का एक उदाहरण पर लिंक नहीं किया गया है

अद्यतन:
बाद Joonas Pulakka कुछ अतिरिक्त जानकारी का जवाब:

से

"एच 2 के लिए लॉग लेखक MYAPPLICATION" J9VMThread: 0x08DC6F00, j9thread_t: 0x08C9B790, जावा/लैंग/गु javacore मैं का उपयोग कर एक kill -3 मैं धागे को देखने मिला पढ़ें: 0xE7206CC8, राज्य: सीडब्ल्यू, prio = 5 3XMTHREADINFO1 (देशी धागा ID: 0xA32, देशी प्राथमिकता: 0x5, देशी नीति: अज्ञात) 3XMTHREADINFO2
(देशी ढेर पता श्रेणी से: 0xE5E26000, करने के लिए: 0xE5E67000, का आकार: 0x41000) 3XMTHREADINFO3 जावा callstack: जावा में
4XESTACKTRACE/लैंग/Object.wait (मूल निवासी विधि) जावा/लैंग/Object.wait (Object.java:196 (संकलित कोड में
4XESTACKTRACE) ऑर्ग/h2 पर) 4XESTACKTRACE /store/WriterThread.run(WriterThread.java:102)
जावा/लैंग/थ्रेड.रुन (थ्रेड) पर 4XESTACKTRACE।जावा: 736)

3XMTHREADINFO "पूल-8-धागा -1" J9VMThread: 0x087C0200, j9thread_t: 0x0840566C, जावा/लैंग/थ्रेड: 0xE79BFC80, राज्य: पी, prio = 5
3XMTHREADINFO1 (देशी धागा ID: 0xE1A, देशी प्राथमिकता: 0x5, देशी नीति: अज्ञात) 3XMTHREADINFO2
(देशी ढेर पता श्रेणी से: 0xE5F69000, करने के लिए: 0xE5FAA000, का आकार: 0x41000) 3XMTHREADINFO3 जावा callstack: सूर्य/विविध/Unsafe.park पर
4XESTACKTRACE (मूल विधि)
4Xजावा/उपयोग/समवर्ती/ताले/LockSupport.park (LockSupport.java:184 (संकलित) पर 4XESTACKTRACEकोड)) जावा/util/समवर्ती/LinkedBlockingQueue.take (LinkedBlockingQueue.java:413 पर जावा/util/समवर्ती/ताले/AbstractQueuedSynchronizer $ ConditionObject.await (AbstractQueuedSynchronizer.java:1998 (संकलित कोड)) 4XESTACKTRACE पर 4XESTACKTRACE (संकलित कोड)) जावा/util/समवर्ती/ThreadPoolExecutor.getTask (ThreadPoolExecutor.java:958 (संकलित कोड)) 4XESTACKTRACE पर जावा/util/समवर्ती/ThreadPoolExecutor $ Worker.run (कम से 4XESTACKTRACE ThreadPoolExecutor.java:918) जावा/लैंग/Thread.run (Thread.java:736 पर 4XESTACKTRACE)

3XMTHREADINFO "एच 2 फ़ाइल ताला निगरानी opt/myOrg/बिल्ला/webapps/MyApplication/db/myDatabase.lock.db " J9VMThread: 0x08DC6900, j9thread_t: 0x08C9BA24, ja
va/लैंग/थ्रेड: 0xE71E9018, राज्य: सीडब्ल्यू, prio = 9 3XMTHREADINFO1
(देशी धागा ID: 0xA30, देशी प्राथमिकता: 0x9, देशी नीति: अज्ञात)
3XMTHREADINFO2 (देशी ढेर पता श्रेणी से: 0xE5DBA000, रहे हैं: 0xE5DFB000, आकार: 0x41000) 3XMTHREADINFO3 जावा callstack: 4XESTACKTRACE जावा में/लैंग/धागा । नींद (मूल विधि) 4XESTACKTRACE
जावा/लैंग/थ्रेड.sleep (थ्रेड.जावा:851 (संकलित कोड))
4XESTACKTRACE संगठन/एच 2/स्टोर/फाइल पर eLock.run (FileLock.java:490) 4XESTACKTRACE
जावा में/लैंग/Thread.run (Thread.java:736)

3XMTHREADINFO "FileWatchdog" J9VMThread: 0x087C0800, j9thread_t: 0x08C9B4FC, जावा/लैंग/धागा : 0xE715D878, राज्य: सीडब्ल्यू, prio = 5
3XMTHREADINFO1 (देशी धागा ID: 0xA2C, देशी प्राथमिकता: 0x5, देशी नीति: अज्ञात) 3XMTHREADINFO2
(देशी ढेर पता श्रेणी से: 0xE5E67000, करने के लिए: 0xE5EA8000, का आकार: 0x41000) 3XMTHREADINFO3 जावा कॉलस्टैक:
जावा/लैंग/थ्रेड.sleep (मूल विधि) पर 4XESTACKTRACE 4X35ACK64AC61 पर 4XESTACKTRACEजावा/लैंग/Thread.Sleep (Thread.java:851 (संकलित कोड)) 4XESTACKTRACE org/अपाचे/log4j/सहायकों/FileWatchdog.run (FileWatchdog.java:104)

+0

[संभवतः डुप्लिकेट [प्ले! एच 2 को सही तरीके से बंद नहीं करना] (http://stackoverflow.com/questions/7182515/play-not-shutting-down-h2- सही ढंग से) –

+0

@ मोहम्मद मैन्सोर: मैंने उस धागे को पढ़ा है लेकिन मदद नहीं करता है .1) मैंने टॉमकैट को बंद कर दिया और आवेदन नहीं। तो कोई कनेक्शन खुला नहीं होना चाहिए 2) जवाब एक काम-आसपास का प्रतीत होता है और मैं समझने की कोशिश कर रहा हूं कि एक हुक से SQL कमांड के माध्यम से 'शटडाउन' की शक्ति वास्तव में अनुशंसित दृष्टिकोण है या नहीं।मैं दस्तावेज़ – Jim

+0

एच 2 से नहीं बता सकता ['addShutdownHook() '] (http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang 'Org.h2.engine.DatabaseCloser' के उदाहरण का उपयोग करके, आपके लिए।% 2 9)। – trashgod

उत्तर

7

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

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

बड़े डेटाबेस के साथ, बंद करने में कुछ समय लग सकता है। डीबगर (उदा। विजुअलVM) के साथ देखें, आपके द्वारा बोले जाने के बाद कौन सा थ्रेड सक्रिय रहता है (टॉमकैट) शटडाउन।

अधिक संभावना पर नहीं है: फाइल अनुमति सेट कर रहे हैं ताकि एच 2 ताला फ़ाइलें बना सकते हैं, लेकिन उन्हें नहीं हटा सकते हैं। यदि ओएस एच 2 को अपनी लॉक फाइलों को हटाने से रोकता है, तो इसके बारे में ज्यादा एच 2 नहीं कर सकता है।

+0

धन्यवाद। मैं जांच करने की कोशिश कर रहा था कि प्रक्रिया क्यों नहीं रुकती है (http://stackoverflow.com/questions/9971876/tomcat-doesnt-stop-how-can-i-debug- यह) और मैं यहां समाप्त हुआ। फ़ोल्डर में भी उपयोगकर्ता को 'rw-'अनुमति है और समूह को अनुमति है। क्या मुझे हटाने के लिए' x' अनुमति की आवश्यकता है? – Jim

+0

'x' केवल निष्पादन के लिए आवश्यक है, हटाने के लिए नहीं। लेकिन जांचें कि निर्देशिका में [चिपचिपा बिट] नहीं है (http://www.thegeekstuff.com/2011/02/sticky-bit-on-directory-file/) सेट करें। –

+0

निर्देशिका में कोई 't' नहीं है। और tomcat उपयोगकर्ता का उपयोग कर चल रहा है जो फ़ाइलों का मालिक है.अब मैं फंस गया हूँ! – Jim

1

नहीं, एक बंद में हुक बस एक थ्रेड होता है जो JVM समाप्त होता है, चाहे कोई भी मुख्य() से लौटकर, System.exit (int) को कॉल करके या अपवाद फेंक दे। केवल एक जेवीएम दुर्घटना इससे बच जाएगी। Runtime.addShutdownHook (थ्रेड) देखें।

+0

नहीं है मुझे पता है कि शटडाउन हुक क्या है। मैं यह नहीं बता सकता कि यह H2 – Jim

+0

@Jim को बंद करने का उचित तरीका है या नहीं: यदि आप पता है कि शटडाउन हुक क्या है, आपने क्यों पूछा "* क्या यह शटडाउन हुक का अर्थ है? *" –

+0

@a_horse_with_no_name: मेरा मतलब है 'एच 2' को बंद करने के संदर्भ में। मुझे यह दिखाने पर एक उदाहरण नहीं मिला है कि मैं मुझे एक हुक जोड़ना चाहिए – Jim

1

सुनिश्चित नहीं है कि यह आपकी स्थिति के लिए प्रासंगिक है लेकिन क्या आपने डीबीस्टाटर श्रोता जोड़ने की कोशिश की है?

http://www.h2database.com/html/tutorial.html, "डेटाबेस शुरू करने और रोकने के लिए एक सर्वलेट श्रोता का उपयोग करना" अनुभाग देखें।

लिंक web.xml के लिए निम्न जोड़ने का सुझाव:

<listener> 
    <listener-class>org.h2.server.web.DbStarter</listener-class> 
</listener> 

कृपया चर्चा यहाँ (2008 से वैसे तो पुराना हो सकता है) देखते हैं - जाहिरा तौर पर ठीक दोनों एम्बेडेड और गैर एम्बेडेड उदाहरणों पर लागू होता है : http://groups.google.com/group/h2-database/browse_thread/thread/eb609d58c96f4317

वैकल्पिक रूप से आप कनेक्शन का उपयोग कैसे कर रहे हैं? क्या आप वाकई कनेक्शन को ठीक से साफ कर रहे हैं?

मैं मुद्दों कर रहा था से पहले, मेरे मामले में मैं एक जेपीए EntityManager साथ कनेक्शन का उपयोग कर रहा था और मैं कुछ मुद्दों में उपयोग के बाद EntityManager उदाहरण बंद करने के लिए है, जो परिणामस्वरूप भूल गया:

@PersistenceUnit(unitName="myEm") 
private EntityManagerFactory emf; 

public void doStuff() { 
    EntityManager em = emf.createEntityManager(); 
    ... 
    em.close(); // forgot this line 
} 
1

आप निष्पादित कर सकते हैं कथन SHUTDOWN और फिर कनेक्शन बंद करें।

SHUTDOWN कमांड एच 2 मुक्त कनेक्शन से संबंधित सभी संसाधनों को तुरंत मुक्त कर देगा। उदाहरण के लिए, जब आप किसी वेब एप्लिकेशन को पुन: नियोजित करते हैं, तो आपको एम्बेडेड एच 2 डेटाबेस से छुटकारा पाने की अनुमति मिलती है।

2

DbStarter.contextDestroyed() को देख '(रों answer रों कोड Allan5 करने के लिए धन्यवाद') द्वारा, यहाँ कोड है कि काम करेगा:

connection.createStatement().execute("SHUTDOWN"); 

तो Aaron Digulla के answer सही था (यहां तक ​​कि पूरी तरह से नहीं "कॉपी करता है, तो/pastable ")।

इसके अलावा, अगर आपने server = Server.createTcpServer("-tcpAllowOthers") का उपयोग कर एच 2 टीसीपी सर्वर शुरू किया है, तो आप इसे server.stop() का उपयोग करके रोक सकते हैं।

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

  • कोई संबंधित समस्या नहीं^_^