プログラマメモ2 - programmer no memo2

インメモリで初期化を行います。そのときにRunscriptを使うサンプルです。 - H2 その2 また別のやりか 2014/09/02

前回
プログラマメモ2: インメモリで初期化を行います。そのときにRunscriptを使うサンプルです。 - H2

コードでやる分にはこれでいいんだけど、まあ大概は、データソースを指定時にRUNSCRIPTするだろうから、クラスパスからRUNSCRIPTを指定する場合どうするんだろうってことで、

参考:
java - problem with INIT=RUNSCRIPT and relative paths - Stack Overflow

 こんな感じ(複数のRUNSCRIPTを動作させることを想定)

jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:resources/create.sql'\;RUNSCRIPT FROM 'classpath:resources/populate.sql'\;;DB_CLOSE_DELAY=-1;

セミコロンが冗長だけど、そこは目をつぶって。。。。

以下コード

package deiji_gamebook_app.db; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class TestDb2 { public static Connection connection() throws SQLException, IOException { StringBuilder builder = new StringBuilder(); String[] paths = { "resources/create.sql", "resources/populate.sql" }; for (String s : paths) { // 参考:Stack Overflow // classpath: をつけるといいみたい。 // jarにしても多分大丈夫かも builder.append("RUNSCRIPT FROM ").append("'").append("classpath:") .append(s).append("'").append("\\;"); } // DB_CLOSE_DELAY=-1をつけることでVM が生存している間接続OK String url = "jdbc:h2:mem:test;INIT=" + builder + ";DB_CLOSE_DELAY=-1;"; System.out.println(url); Connection connection = DriverManager.getConnection(url); return connection; } }


: