আমি কি ইন-মেমরি ডেটাবেসে এইচ 2 স্বতঃসত্ত্বা করতে পারি?


96

(আমি ইতিমধ্যে মেমোরিতে এইচ 2 ডাটাবেসটি দেখেছি - স্প্রিং / হাইবারনেট প্রশ্নের মাধ্যমে ইনিশ স্কিমা ; এটি এখানে প্রযোজ্য নয়))

আমি জানতে চাই যে এইচ 2 তে এমন কোনও সেটিংস রয়েছে যা এর সাথে সংযোগ স্থাপনের পরে আমাকে একটি স্কিমা স্বয়ংক্রিয়ভাবে তৈরি করতে দেয়। যদি এটি সহায়তা করে তবে আমি কেবল ইন-মেমরির ক্ষেত্রে আগ্রহী।

এইচ 2 ইউআরএল শেষে বিভিন্ন সেমিকোলন-বিচ্ছিন্ন সংশোধককে সমর্থন করে তবে স্বয়ংক্রিয়ভাবে স্কিমা তৈরির জন্য আমি একটিও পাইনি। এমন বৈশিষ্ট্য আছে কি?

উত্তর:


176

হ্যাঁ, এইচ 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প্রয়োজন।


আপনাকে অনেক ধন্যবাদ; নিশ্চিত না যে আমি কীভাবে এটি (সেরা) ডকুমেন্টেশনে মিস করেছি।
লেয়ার্ড নেলসন

আপনাকে ধন্যবাদ, এটি তাত্ক্ষণিকভাবে তৈরি হয়েছিল কারণ আমি জেনারেটেড এক্সএমএল এর জন্য স্কিমার নাম ব্যবহার করে তরলবয়েজ থেকে উত্পন্ন পরিবর্তনগুলি ব্যবহার করছি।
জাইমে হাবলুটজেল

4
মনে রাখবেন আপনি যদি হাইবারনেট সহ এইচ 2 ব্যবহার করেন এবং রুনস্প্রিট কল করে একাধিক স্ক্রিপ্ট চালাতে চান তবে আপনার ট্রিপল ব্যাকস্ল্যাশ (\\\) টাইপ করা উচিত। উদাহরণস্বরূপ, <property name="hibernate.connection.url">jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'script1.sql'\\\;RUNSCRIPT FROM script2.sql'</property>আপনার হাইবারনেট কনফিগারেশন সেট আপ করা উচিত ।
জনি

@ জোহনি আপনি কি নিশ্চিত? দেখে মনে হচ্ছে যেন ;পালানোর দরকার নেই (এর ;আগে একটি অপরিবর্তিত রয়েছে INIT)। শুধুমাত্র একটি ব্যাকস্ল্যাশ ব্যবহার করে আপনি চেষ্টা করতে পারেন? 'script1.sql'\;RUNSCRIPT...
থমাস মেলার

4
@pinkpanther হ্যাঁ, দেখতে stackoverflow.com/questions/4490138/...
টমাস মুলার

18

আপনি যদি অ্যাপ্লিকেশন.আইএমএল সহ বসন্ত ব্যবহার করেন তবে নিম্নলিখিতগুলি আপনার জন্য কাজ করবে

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


গ্রেইল 3
xtheshadowgod

4
আপনাকে অনেক ধন্যবাদ. আমি এই টিপটি এমন কোনও সমস্যা সমাধানের জন্য ব্যবহার করেছি যা আমার কোডটিকে 4 দিনের জন্য কাজ না করার কারণ করে।
ডিপবয়

9

থমাস যা লিখেছেন তা সঠিক, এছাড়াও আপনি একাধিক স্কিমার সূচনা করতে চাইলে আপনি নীচেরটি ব্যবহার করতে পারেন। নোট \\;দুটি পৃথক বিবৃতি তৈরি একটি পৃথক আছে ।

    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_ সংযোগ


8

"ডিফল্টরূপে, যখন কোনও অ্যাপ্লিকেশন কল 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);
        }
    }
}

হ্যাঁ, এবং এটি ক্যাটালগ বা ডাটাবেস , এটির মধ্যে কোনও স্কিমা নয়। সুতরাং আপনি জেডিবিসি: এইচ 2: মেম: পরীক্ষার সাথে সংযোগটি খুলতে পারেন, উদাহরণস্বরূপ, তবে ডিফল্টরূপে আপনি পাবলিক স্কিমাতে স্থাপন করেছেন এবং অন্য কোনও স্কিমাটা উপস্থিত নেই।
লেয়ার্ড নেলসন

1

যদি আপনি স্প্রিং ফ্রেমওয়ার্কটি ব্যবহার করে থাকেন application.ymlএবং পরীক্ষায় INITসম্পত্তিটিতে এসকিউএল ফাইলটি সন্ধান করতে সমস্যা হয় তবে আপনি classpath:স্বরলিপিটি ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, যদি আপনি একটি আছে init.sqlউপর এসকিউএল ফাইল src/test/resources, শুধু ব্যবহার :

url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.