2009/04/10

Google App EngineでH2 Database Engine使ってみた

巷で話題になっているけど、Google App EngineでJavaがサポートされたことで、GroobyやJRuby、Scalaも動かせるようになりました。
Googleがそんなステキなことをしてくれていた陰で、H2はH2 Database Engine 1.1.111をリリースしています。

その変更履歴にこんな1文が。
Version 1.1.111 (2009-04-10)
* In-memory databases can now run inside the Google App Engine.
Google App Engineで、DBにはGoogle App Engine Datastoreを使わないといけなかった(?)んだけど、JavaサポートのおかげでRDBのH2(in-memory)も使えるようになっていたみたい。
ということで、さっそくお約束のHello Worldを試してみました。

まずはweb.xmlにDBの起動/接続設定とHelloWorldServletの定義を追記します。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
<listener>
<listener-class>org.h2.server.web.DbStarter</listener-class>
</listener>

<context-param>
<param-name>db.url</param-name>
<param-value>jdbc:h2:mem:HelloWorld</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>

<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>net.air_life.gae.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>


JDBC URLにjdbc:h2:mem:というように、memを指定してメモリオンリーデータベースとして動作するようにします。
memを指定しないとDBファイルを作ろうとして、下記のような例外が発生します。
org.h2.jdbc.JdbcSQLException: General error: java.security.AccessControlException: access denied (java.io.FilePermission /HelloWorld.data.db read) [50000-111]
次にDBにアクセスするHelloWorldServletを作ります。
package net.air_life.gae;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

import javax.servlet.http.*;

@SuppressWarnings("serial")
public class HelloWorldServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");

try {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:mem:HelloWorld", "sa", "sa");
ResultSet rs = conn.createStatement().executeQuery("select 'Hello World on Google App Engine for Java'");
while (rs.next()) {
resp.getWriter().print(rs.getString(1));
}
rs.close();
conn.close();
} catch (Exception e) {
resp.getWriter().print(e.getMessage());
}
}
}
あとはデプロイして、アクセスするとHello Worldが表示されます。
だいぶ適当ですが、まずはこれくらいに。

0 件のコメント: