আমি কি ইন-মেমরি ডেটাবেসে এইচ 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.