2011-12-15 15 views
30

मैं डेमो सर्वर में अपने एप्लिकेशन का एक नया संस्करण स्थापित कर रहा हूं और डेटाबेस को रीसेट करने का एक तरीका ढूंढना पसंद करूंगा। मुझे लगता है कि मैं हमेशा एक क्रॉन नौकरी निष्पादित ड्रॉप कर सकता हूं और प्रश्न बना सकता हूं लेकिन मैं एक क्लीनर दृष्टिकोण की तलाश में हूं। मैंने ड्रॉप-निर्माण दृष्टिकोण के साथ एक विशेष दृढ़ता इकाई का उपयोग करने की कोशिश की लेकिन यह काम नहीं करता क्योंकि सिस्टम अक्सर सर्वर से (मांग पर) कनेक्ट और डिस्कनेक्ट करता है।समय-समय पर एंबेडेड एच 2 डेटाबेस रीसेट करें

क्या कोई बेहतर तरीका है?

उत्तर

55

एच 2 drop all objects के लिए एक विशेष SQL विवरण का समर्थन करता है:

+0

धन्यवाद। मैं काम कर रहा हूँ इसे कार्यान्वित करने पर। – javydreamercsw

+1

ट्रंकेट टेबल शून्य पर ऑटोऑक्रिकमेंट काउंटर को रीसेट नहीं करता है :( – Nazar

+2

@ नज़र, हाँ, यह अन्य डेटाबेस के समान व्यवहार है, उदाहरण के लिए PostgreSQL ('serial' का उपयोग करके)। मुझे लगता है कि यह सही व्यवहार है, मानों को अन्य तालिकाओं में उपयोग किया जा सकता है। –

1

आदेश:

DROP ALL OBJECTS [DELETE FILES] 

आप सभी तालिकाओं ड्रॉप नहीं करना चाहते हैं, तो आप का उपयोग करने के truncate table चाहते हो सकता है बंद
आप RunScript.execute (jdbc_url, उपयोगकर्ता, पासवर्ड, "classpath: shutdown.sql", "UTF8", false का उपयोग करके इसे निष्पादित कर सकते हैं;
मैं जब परीक्षण के सुइट @AfterClass

12

का उपयोग कर इस प्रतिक्रिया "रीसेट एच 2 डेटाबेस" के लिए, मैं नीचे मेरी समाधान पोस्ट पहले गूगल परिणाम है के रूप में समाप्त हो गया है यह हर बार चला सकता हूँ:

प्रत्येक के बाद JUnit @tests:

  • अक्षम अखंडता बाधा
  • सूची (डिफ़ॉल्ट) में सभी तालिकाओं सार्वजनिक स्कीमा
  • काट-छांट सभी तालिकाओं
  • सूची (डिफ़ॉल्ट) में सभी दृश्यों सार्वजनिक स्कीमा
  • रीसेट सभी दृश्यों
  • पुन: सक्षम की कमी।

    @After 
    public void tearDown() { 
        try { 
         clearDatabase(); 
        } catch (Exception e) { 
         Fail.fail(e.getMessage()); 
        } 
    } 
    
    public void clearDatabase() throws SQLException { 
        Connection c = datasource.getConnection(); 
        Statement s = c.createStatement(); 
    
        // Disable FK 
        s.execute("SET REFERENTIAL_INTEGRITY FALSE"); 
    
        // Find all tables and truncate them 
        Set<String> tables = new HashSet<String>(); 
        ResultSet rs = s.executeQuery("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='PUBLIC'"); 
        while (rs.next()) { 
         tables.add(rs.getString(1)); 
        } 
        rs.close(); 
        for (String table : tables) { 
         s.executeUpdate("TRUNCATE TABLE " + table); 
        } 
    
        // Idem for sequences 
        Set<String> sequences = new HashSet<String>(); 
        rs = s.executeQuery("SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA='PUBLIC'"); 
        while (rs.next()) { 
         sequences.add(rs.getString(1)); 
        } 
        rs.close(); 
        for (String seq : sequences) { 
         s.executeUpdate("ALTER SEQUENCE " + seq + " RESTART WITH 1"); 
        } 
    
        // Enable FK 
        s.execute("SET REFERENTIAL_INTEGRITY TRUE"); 
        s.close(); 
    } 
    

अन्य समाधान प्रत्येक परीक्षण की शुरुआत में डेटाबेस recreatethe होगा। लेकिन बड़े डीबी के मामले में यह बहुत लंबा हो सकता है।

+0

यह बहुत अच्छा काम करता है, धन्यवाद – aliopi

1

Thre डेटाबेस हेरफेर के लिए वसंत में विशेष सिंटेक्स इकाई के भीतर परीक्षण

@Sql(scripts = "classpath:drop_all.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) 
@Sql(scripts = {"classpath:create.sql", "classpath:init.sql"}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) 
public class UnitTest {} 

इस उदाहरण में हम हर परीक्षा पद्धति के बाद अमल drop_all.sql लिपि (जहां हम सभी आवश्यक तालिकाओं dropp) है। इस उदाहरण में हम स्क्रिप्ट init.sql create.sql लिपि (जहां हम सभी आवश्यक टेबल बना) और अमल (जहां हम सभी आवश्यक तालिकाओं init से पहले प्रत्येक परीक्षा पद्धति।

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