Stax Networksのクラウド上にデータベースを作成する

Google App EngineでもついにJavaをサポートすることが正式に発表された。ただし、現在はまだテスト版という扱いでコアAPIのフルセットがサポートされているわけではなく、また利用できるのもテストユーザ1万人に限定されている。今後の展開に期待したいところだ。

さて、今回はStax Networksにおいて作成したWebアプリケーションからデータベースを利用する方法を紹介する。StaxではデータベースサーバとしてMySQLを利用することができる。データベースの作成はアプリケーションコンソールから行う。左上の[Create DB]ボタン(図1)をクリックすると図2のようなダイアログが表示されるので、ここに任意のデータベース名とユーザ名、パスワードを設定すればよい。ただし、データベース名とユーザ名はクラウド内でユニークなものでなくてはならない。また、ここで設定するユーザはMySQLのためのものなので、Staxのアカウントとは別のものである。

図1 [Create DB]ボタンでデータベースを作成する

図2 任意のデータベース名、ユーザ名が利用可能

図3のように表示されればデータベースの作成は成功だ。[View database]ボタンをクリックすればデータベース管理用のアプリケーションコンソールが表示される。今回はmjsampledbという名前でデータベースを作成してみた。管理コンソールは図4のようになっており、赤で囲った部分にデータベースにアクセスする場合に必要な情報が記載されている。またその下の「Cribsheet Snippets」の部分に記載されているのは、プログラムからデータベースにアクセスするための設定例およびサンプルコードである。

図3 データベースの作成に成功

図4 データベース管理用のコンソール

作成したデータベースに対しては、MySQLに対応した通常のデータベース管理ツールを使えばアクセスすることができる。たとえばMySQLに付属しているmysqlコマンドやMySQL Query Browserをはじめとして、Eclipse DTP(Data Tools Platform)などのEclipse系ツールも利用することが可能だ。図1.5はEclipse DTPにおけるドライバーの設定例である。

図5 データベース管理用のコンソール

接続に成功したら、あとは任意のSQLを実行してテーブルを作成すればよい。今回は次ののようなSQLでnameとemailという2つのフィールドを持つテーブルを作成し、適当なデータを入力しておいた。

リスト1

CREATE TABLE addressbook (
        name VARCHAR(64) NOT NULL,
        email VARCHAR(128),
        PRIMARY KEY (name)
);

INSERT INTO addressbook VALUES ('マイコミ太郎', 'mycomtaro@example.com');
INSERT INTO addressbook VALUES ('毎日次郎', 'jiro@example.co.jp');

アプリケーションからデータベースにアクセスする

データベース側の準備ができたので、今度はそこからデータを取得するようにプログラムの方を修正してみよう。ここでは前回に引き続き、MyFirstAppをベースにして話を進める。Staxのデータベースにアプリケーションからアクセスするには、JNDIによるデータソース管理機能を利用する。これによって、クラウド上のどの場所にデータベースが存在してもアプリケーション側の設定を変更しなくてもアクセスできるようになるからだ。

まずアプリケーションから利用するデータソースを定義するため、webapp/WEB-INF/web.xmlの<web-app>タグ内に以下のような設定を追加する。この場合データソースの名前は「jdbc/mjsampledb」になる。

リスト2

  <resource-ref>
        <res-ref-name>jdbc/mjsampledb</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
  </resource-ref>

次に「jdbc/mjsampledb」というデータソース名をクラウド上の実際のデータベースと関連付けるため、conf/stax-application.xmlの<stax-application>タグ内に以下の設定を追加する。

リスト3

        <resource name="jdbc/mjsampledb" auth="Container" type="javax.sql.DataSource">
                <param name="username" value="[ユーザ名]" />
                <param name="password" value="[パスワード]" />
                <param name="url" value="jdbc:stax://mjsampledb" />
        </resource>

以上により、プログラム内でJNDIを利用して「java:comp/env/jdbc/mjsampledb」という名前をルックアップすればデータベース接続のためのjavax.sql.DataSourceオブジェクトが返されるようになる。Servletのプログラムは、HelloServlet.javaを修正して次のような感じにした。Servletに関する細かな解説はここでは省略するが、取得したDataSourceを利用してデータベースに接続し、SELECT命令で取得した内容をHTMLのテーブルにして表示するというシンプルなものだ。

リスト4

package example;
import java.io.*;
import java.sql.*;
import javax.naming.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import javax.sql.DataSource;

public class HelloServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;

        public void doGet(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {

                resp.setContentType("text/html; charset=UTF-8");
                PrintWriter writer = resp.getWriter();

        writer.println("<html lang='ja'>");
        writer.println("<head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'></head>");
        writer.println("<body>");

        writer.println("<h1>攻略! Stax Networks</h1>");
        writer.println("<table border='1'>");
        writer.println("<tr><th>名前</th><th>E-mail</th></tr>");

                try {
                        // データベースからデータを取得してテーブルに表示
                        Context ctx = new InitialContext();
                        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mjsampledb");
                        Connection conn = ds.getConnection();
                        Statement stmt = conn.createStatement();
                        ResultSet rst = stmt.executeQuery("SELECT name, email FROM addressbook");
                        while(rst.next()) {
                        writer.print("<tr>");
                                String name = rst.getString(1);
                                String email = rst.getString(2);
                        writer.print("<td>" + name + "</td><td>" + email + "</td>");
                        writer.print("</tr>");
                        }
                        conn.close();
                }
                catch (NamingException e) {
                        e.printStackTrace();
                } catch (SQLException e) {
                        e.printStackTrace();
                }

                writer.println("</table>");
            writer.println("</body></html>");
    }
}

Stax SDKのstax runコマンドを使ってローカルで実行し、Webブラウザからhttp://localhost:8080/helloにアクセスすれば図6のように表示される。Stax上のデータベースからデータが取得できていることがわかる。

図6 ローカルで実行してWebブラウザからアクセスした例

ローカルで正しく動作することが確認できたら、stax deployコマンドでStax上にデプロイしてWebブラウザからアクセスしてみよう。ローカルの場合と同様に図7のように表示されればデプロイ成功だ。

図7 クラウド上にデプロイしてWebブラウザからアクセス

Staxで用意されているデータベースはMySQLなので多くの開発者にとって馴染みの深いものだろう。アプリケーションから利用するには簡単なJNDIの設定を追加するだけでよい。また、管理コンソールからは[Create snapshot]ボタンによってワンタッチでデータベースのスナップショットを作成することができる。管理コンソールには図8のように作成したスナップショットが一覧表示される。スナップショットへ復帰させるには左の黄色いアイコンをクリックするだけでよい。開発/運用中に任意の時点の状態に簡単に戻すことができるので、非常に便利な機能である。

図8 簡単にスナップショットを作成することが可能