読者です 読者をやめる 読者になる 読者になる

Webアプリの起動時にH2を起動してデータも突っ込む

Webアプリの起動時にH2を自動で起動したいなーって時、DbStarterというのがH2から提供されています。
http://www.h2database.com/html/tutorial.html#web_applications

ただデータの初期化まではやってくれないので、ちょっと拡張してみた。

public class MyDbStarter extends DbStarter {
	@Override
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		try {
			super.contextInitialized(servletContextEvent);

			String scriptConfig = servletContextEvent.getServletContext()
					.getInitParameter("db.scripts");
			String[] scripts = scriptConfig.split(",");
			for (String sclipt : scripts) {
				RunScript.execute(getConnection(), new FileReader(new File(getClass().getResource(sclipt).toURI())));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

web.xmlはこんなん。

<web-app>
  <context-param>
    <param-name>db.url</param-name>
    <param-value>jdbc:h2:mem:test</param-value>
  </context-param>
  <context-param>
    <param-name>db.user</param-name>
    <param-value>sa</param-value>
  </context-param>
  <context-param>
    <param-name>db.password</param-name>
    <param-value>sa</param-value>
  </context-param>
  <context-param>
    <param-name>db.tcpServer</param-name>
    <param-value>-tcpAllowOthers</param-value>
  </context-param>
  <context-param>
    <param-name>db.scripts</param-name>
    <param-value>/data/init.sql</param-value>
  </context-param>

  <listener>
    <listener-class>org.yamkazu.h2.MyDbStarter</listener-class>
  </listener>

  <servlet>
    <servlet-name>H2Console</servlet-name>
    <servlet-class>org.h2.server.web.WebServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>H2Console</servlet-name>
    <url-pattern>/console/*</url-pattern>
  </servlet-mapping>

</web-app>

クラスパスから/data/init.sqlを読んで実行する感じ。
メモリで起動して、再起動すると初期化される。結構便利。