2012-11-01 21 views
10

私は現在、組み込み桟橋とH2データベースを使用してMavenの上で私のpetprojectを実行します。Spring H2組み込みデータベースファイル?

<jdbc:embedded-database id="dataSource" type="H2"> 
    <jdbc:script location="/WEB-INF/database.sql"/> 
</jdbc:embedded-database> 

このセットアップは、私は、サーバーを実行するたびに、私のDBをリセットします。私はディスクにファイルとしてDBを保存して、すべてのサーバーの起動時にデータを失わないようにします。これをどのように達成するのですか?

+1

達成したいことに関する詳細情報を提供できますか?別のデータベースに切り替えようとしていますか? –

+0

データベースのURLは何ですか? –

+0

私はH2データベースをメモリの代わりにディスクに保存したいと思っています。 – Pomario

答えて

7

これは接続文字列で制御できます。

jdbc:h2:~/test; # saves to the file ~/test 
jdbc:h2:mem:db1 # in memory 

詳細情報here

EDIT:接続文字列が春H2設定でhard-codedあるよう

はそう、私はそれが接続を変更する他の方法がないと仮定すると、あなたがEmbeddedDatabaseConfigurerを拡張することによってあなたの独自の実装を記述しなければならないことを意味と仮定文字列はH2EmbeddedDatabaseConfigurerに設定されています。

+0

解決策の後、私は "mydb"ファイルを見つけることができません。私は何かが足りないのですか?<豆ID = "データソース" クラス= "org.springframework.jdbc.datasource.DriverManagerDataSource"> \t \t <プロパティ名= "driverClassName" 値= "org.h2.Driver" /> \t \t <プロパティ名= "url"値= "jdbc:h2:〜/ mydb" /> \t – Pomario

+0

申し訳ありません。編集を参照してください。 – ebaxt

2

古い質問がありましたが、埋め込まれたH2データベースをファイルに保存する方法を理解するのに多くの時間を費やしました。

@ebaxtは、接続文字列内に埋め込みデータベースの場所を設定できると述べています。 ファイルシステムの使用中~/構文を、それを保存したい場合:

jdbc:h2:~/example/embeddedDb 

あなたのプロジェクトフォルダ内に保存したい場合は、./構文を使用する必要が

jdbc:h2:./example/embeddedDb 

をこれはembeddedDb.mv.dbファイルを作成します。ホームフォルダ内のexampleフォルダ、またはプロジェクトのルートフォルダ内のフォルダに保存します。 しかし、これは、アプリケーションが起動するたびにデータベースを消去します。この私はそれが存在していない場合にのみ、(私の場合はキュー)スキーマを作成するために、H2を伝えるためにINITプロパティを使用しないようにするには:

INIT=create schema if not exists Queue; 

を次に、あなたのDDLスクリプトに次の文を存在しない場合は、テーブルを作成し使用する必要があり、

// create-db.sql 
    CREATE TABLE IF NOT EXISTS Queue (
     id INTEGER PRIMARY KEY AUTO_INCREMENT, 
     ... 
    ); 

を、スクリプトにそれが接続されるたびに実行するためにH2を伝える:すべてのテーブルを作成するには、これをまとめる

// if you want to store the script in the file system 
runscript from '~/example/create-db.sql' 

// if you want to store the script in the project folder 
runscript from './example/create-db.sql' 

すると、CREにしなければならないものですこの方法では

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="org.h2.Driver" /> 
     <property name="url" value="jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\; runscript from '~/example/create-db.sql'" /> 
     <property name="username" value="embedded" /> 
     <property name="password" value="embedded" /> 
    </bean> 

データベースは、アプリケーションがデータベースを実行する場合、または初めての場合にのみ作成されます。

import org.springframework.jdbc.datasource.DriverManagerDataSource; 

    @Bean 
    DataSource datasource(){ 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("org.h2.Driver"); 
     dataSource.setUsername("embedded"); 
     dataSource.setPassword("embedded"); 
     dataSource.setUrl("jdbc:h2:~/example/EmbeddedDb;INIT=create schema if not exists Queue\\; runscript from '~/example/create-db.sql'"); 

     return dataSource; 
    } 

またはXMLを使用して:データベース(EmbeddedDb)Javaの注釈方法で食べましたファイルが存在しません。それ以外の場合は、接続のみがロードされます。

また、次のBeanを追加し、hsqldbライブラリを使用して素敵なインターフェースを使用してデータベースの状態を監視することができます

import org.h2.tools.Server; 
    import org.hsqldb.util.DatabaseManagerSwing; 

    @Bean(initMethod = "start", destroyMethod = "stop") 
    public Server startDBManager() throws SQLException { 
     DatabaseManagerSwing.main(new String[] { "--url", "jdbc:h2:~/example/EmbeddedDb", "--user", "embedded", "--password", "embedded" }); 
     return Server.createWebServer(); 
    } 

参考文献:

http://www.mkyong.com/spring/spring-embedded-database-examples/

http://www.h2database.com/html/features.html#embedded_databases(接続部にSQLを実行します)

関連する問題