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を読んで実行する感じ。
メモリで起動して、再起動すると初期化される。結構便利。