2011-12-15 17 views
6

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

Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
     // H2 db add row, commit and close 
     Thread.sleep(1000); // in try/catch 
     System.out.println("Shutdown complete"); 
    } 
} 

केवल एक sleep के साथ, मैं परिवर्तन अगली बार मैं डीबी से कनेक्ट देखेंगे।

क्या कोई जानता है कि प्रक्रिया समाप्त होने से पहले एच 2 डेटाबेस को ऑपरेशन समाप्त करने के लिए कैसे इंतजार करना है? मैं एक यादृच्छिक समय के साथ Thread.sleep() से बचना चाहता हूं ...

उत्तर

5

आप अपने आवेदन को बंद करने से पहले डिस्क पर सभी लिखने के लिए सही ढंग से फ़्लश करने के लिए SHUTDOWN कमांड का उपयोग कर सकते हैं।

आपके शटडाउन हुक में CHECKPOINT SYNC पर कॉल करने का एक वैकल्पिक समाधान होगा (लेकिन सभी कनेक्शन बंद करने से पहले)। यह डेटाबेस को "बंद" नहीं करेगा जो अंतिम कनेक्शन बंद होने पर स्वचालित रूप से किया जाना चाहिए।

+0

देखें, यह काम कर रहा है! मैं पूरी तरह से SHUTDOWN कमांड के बारे में भूल गया ... – morja

0

आप, executors का उपयोग करके Thread.Sleep() हटाने प्रतिदेय का एक उदाहरण प्रस्तुत और उसके बाद ExecuterServcie -awaitTermination() विधि का उपयोग करने के लिए अपने विधि प्रस्तुत का उपयोग करें या आप उपयोग करने का विकल्प CountDownLatch है हो सकता है - countDown() विधि। CountDownLatch और ExecutorService

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