java - क्या मेरे पास H2 autocreate एक स्कीमा इन-मेमोरी डेटाबेस में हो सकता है?



sql database (5)

(मैंने पहले से ही H2 डेटाबेस को स्मृति में देखा है - स्प्रिंग / हाइबरनेट प्रश्न के माध्यम से इनिट स्कीमा ; यह यहां लागू नहीं है।)

मैं जानना चाहता हूं कि एच 2 में कोई सेटिंग है या नहीं, जो मुझे कनेक्ट करने पर स्कीमा को स्वतः बनाने की अनुमति देगी। अगर यह मदद करता है, तो मुझे केवल मेमोरी मामले में दिलचस्पी है।

एच 2 यूआरएल के अंत में विभिन्न अर्धविराम से अलग संशोधकों का समर्थन करता है, लेकिन मुझे स्वचालित रूप से स्कीमा बनाने के लिए कोई नहीं मिला। क्या ऐसी सुविधा है?


Answers

"डिफ़ॉल्ट रूप से, जब कोई एप्लिकेशन DriverManager.getConnection(url, ...) कॉल करता है और यूआरएल में निर्दिष्ट डेटाबेस अभी तक मौजूद नहीं है, तो एक नया (खाली) डेटाबेस बनाया गया है।" - एच 2 डाटाबेस

अनुपूरक: @ थॉमस म्यूएलर दिखाता है कि कनेक्शन पर एसक्यूएल का निष्पादन कैसे करें, लेकिन मैं कभी-कभी कोड में बना और पॉप्युलेट करता हूं, जैसा कि नीचे दिया गया है।

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/** @see http://stackoverflow.com/questions/5225700 */
public class H2MemTest {

    public static void main(String[] args) throws Exception {
        Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
        Statement st = conn.createStatement();
        st.execute("create table customer(id integer, name varchar(10))");
        st.execute("insert into customer values (1, 'Thomas')");
        Statement stmt = conn.createStatement();
        ResultSet rset = stmt.executeQuery("select name from customer");
        while (rset.next()) {
            String name = rset.getString(1);
            System.out.println(name);
        }
    }
}

थॉमस ने जो लिखा है वह सही है, इसके अतिरिक्त, यदि आप कई स्कीमा शुरू करना चाहते हैं तो आप निम्न का उपयोग कर सकते हैं। ध्यान दें \\; दो निर्माण बयान अलग करना।

    EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
                    .setType(EmbeddedDatabaseType.H2)
                    .setName("testDb;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=create " +
                            "schema if not exists " +
                            "schema_a\\;create schema if not exists schema_b;" +
                            "DB_CLOSE_DELAY=-1;")
                    .addScript("sql/provPlan/createTable.sql")
                    .addScript("sql/provPlan/insertData.sql")
                    .addScript("sql/provPlan/insertSpecRel.sql")
                    .build();

रेफरी: http://www.h2database.com/html/features.html#execute_sql_on_connection


यदि आप spring.yml के साथ वसंत का उपयोग कर रहे हैं तो निम्नलिखित आपके लिए काम करेगा

spring: datasource: url: jdbc:h2:mem:mydb;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL;INIT=CREATE SCHEMA IF NOT EXISTS calendar


हां, एच 2 कनेक्ट करते समय एसक्यूएल स्टेटमेंट निष्पादित करने का समर्थन करता है। आप एक स्क्रिप्ट चला सकते हैं, या सिर्फ एक कथन या दो:

String url = "jdbc:h2:mem:test;" + 
             "INIT=CREATE SCHEMA IF NOT EXISTS TEST"
String url = "jdbc:h2:mem:test;" + 
             "INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" + 
                  "SET SCHEMA TEST";
String url = "jdbc:h2:mem;" + 
             "INIT=RUNSCRIPT FROM '~/create.sql'\\;" + 
                  "RUNSCRIPT FROM '~/populate.sql'";

कृपया ध्यान दें कि डबल बैकस्लैश ( \\ ) केवल जावा के भीतर आवश्यक है। बैकस्लैश (एसएस) पहले ; INIT भीतर आवश्यक है।


मूल जावा के अलावा सीरियलाइजेशन सिस्टम भी इस संशोधक का उपयोग कर सकते हैं। उदाहरण के लिए, हाइबरनेट, @Transient या क्षणिक संशोधक के साथ चिह्नित फ़ील्ड को जारी नहीं रखेगा । Terracotta भी इस संशोधक का सम्मान करता है।

मेरा मानना ​​है कि संशोधक का लाक्षणिक अर्थ यह है कि "यह क्षेत्र केवल स्मृति उपयोग के लिए है। किसी भी तरह से इस विशेष वीएम के बाहर इसे जारी या स्थानांतरित न करें। इसका गैर पोर्टेबल"। यानी आप किसी अन्य वीएम मेमोरी स्पेस में अपने मूल्य पर भरोसा नहीं कर सकते हैं। अस्थिर साधनों की तरह आप कुछ स्मृति और धागा अर्थशास्त्र पर भरोसा नहीं कर सकते हैं।





java sql database h2