Google App Engine(略してGAE)は、Google社が提供するWebアプリケーション実行環境です。
このGAEには、プログラミングによる動的なコンテンツの他、HTML等、一般的な静的コンテンツを自由に配置することができ、 独自ドメイン(※1)を割り当てることもできますので、実質的にWebサーバー+αの環境として利用することができます。 また、無料サービスの幅(※2)が大きく、小規模なWebサイトであればコストゼロでの運用が可能です。
GAEは大変魅力的なインフラですが、残念なことにMySQL、PostgreSQL、ORACLEといった一般的なSQLデータベースを利用できません。替わりにGAE独自のデータストアへアプリケーションのデータを書き込む必要があります。
GAEデータストアには専用のJavaのAPIを使用してアクセスしますが、これらを駆使してデータストアを使いこなす事は、SQLによるDB操作と比較すると少々難易度が高く、 例えば、SQLであれば簡単に実現できるデータのフィルタリング、並べ替え、集計といった操作も、データストアが相手だと熟慮したプログラミングが必要となります。
この為、「GAEというインフラは魅力的だけどデータ周りのプログラミングは難儀だな...」と感じられている方が少なくありません。
そこで、リトルソフトはSQL Database for Google App Engine「SQL4G」を開発し、これまで慣れ親しんだWebアプリケーション開発手法によって GAEアプリケーションをより簡単・スピーディーに構築することを可能にしました。
SQL4Gを使って、「雲の向こう側にある無限のGAEパワー」をもっと活用しましょう!
SQL4Gを利用することで、アプリケーション開発者はGAEデータストアの構造を一切意識することなく、 これまでと同様なServlet,JSPとJDBC-SQLプログラミングを使用して、GAE環境のデータベースアプリケーションを簡単かつスピーディーに構築できるようになります。
さらに、GAEのJavaプラットフォームの上でPHP/Rubyなどのスクリプト言語を使用することも可能です。
⇒⇒詳細はアットマークIT連載記事「 Google App Engine上でLL+RDBアプリを作ろう」をご覧下さい。
PHP/Rubyといった人気の高い軽量言語(LL)とSQL4Gを組み合わせることで、GAEはJavaエキスパートだけのものではなくなり、 幅広いサービス開発者が手軽に活用できるインフラとなるでしょう。リトルソフトこれを実現する試みとして、PHP4Gを開発し、評価版として公開しています。
⇒⇒詳細はGAE上で動くPHP実行環境 【PHP4G】をご覧下さい。
また、これまでSQLデータベースを使って構築された数多くのWebアプリケーションが構築されています。 SQL4Gにより、これらのソフトウェア資産をクラウド・コンピューティング環境に適応する新しいサービスとして、再利用することが可能となります。
一方、SQL4G上で構築したアプリケーションは一般的なSQLデータベースとWebサーバーへ移植する事も簡単です。 GAE環境に深く依存しない、ポータブルなアプリケーションを作成することで、クロス・クラウド・プラットフォームを実現できる点もSQL4Gの大きなメリットといえます。
SQL4Gは、軽量・高速と評価が高いオープンソースのJavaデータベース「H2 Database Engine」をコアに採用し、 リトルソフトの独自エンハンスによって、GAEデータストアへ直接データを書き込む事を実現しました。
システムの負荷に応じて、GAEはWebサーバーとアプリケーションプログラムを含むJava仮想マシン(JVM)を自動的に増減する「スケールアウト」を行います。
SQL4Gは「常駐するサーバープロセス」ではなく、データベースへの接続が要求された際、Webアプリケーションの中で自動的にインスタンスが作成されるJavaオブジェクトなので、 スケールアウトに対応し、その自動的にそのインスタンスも増減します。
SQL4Gでコミットされたデータは、GAEデータストア中の仮想データブロックに書き出されます。この仮想データブロックはGAEエンティティのBLOB型プロパティです。
スケールアウトにより、ひとつのアプリケーション内に複数のSQL4Gオブジェクトが発生している状況では、 GAEデータストア内に作成したロックオブジェクトを参照・交換しあう事で、直列的にデータファイルへの書き出しを処理します。
また、他のSQL4Gオブジェクトからデータが更新された場合、変更されたデータブロックのみをGAEデータストアから再読込し、なるべく小さな処理コストでデータベースの内容をリフレッシュします。
SQL4GのSELECT、INSERT、UPDATE、DELETEは高速に動作し、1回のトランザクションで処理できるデータ件数の制限も無ありません。(30秒ルールには従う必要があります)
一方、ひとつの物理データベースが分散・共有される範囲が広がるにつれて直列の書込みと リフレッシュ処理のオーバーヘッドが大きくなるというリスクがある為、データベース設計ではちょっとした工夫が必要となります。
小規模なアプリケーション(数ユーザーから数十ユーザーの情報共有を目的としたWebアプリケーション)であれば、 特に考慮の必要はありません。SQL4Gは十分なパフォーマンスを発揮します。
一方、巨大なサービスに含まれるデータを単純にひとつの物理データベースに収める事は現実的ではありません。
SQL4Gに十分なパフォーマンスを発揮させると同時にGAEスケール・アウトへの対応を実現させる為、 適当なサイズ(テーブルの数)、あるいは情報共有の単位(グループ、サークル、部門)で、物理データベースの分割について検討してください。
また、「数百万の会員データベース全体はGAEデータストアに直接格納」、「会員が利用するWebメールアプリは会員毎のSQL4Gインスタンスに格納」といった役割分担も有効な手法です。
ソート、フィルター、結合といった複雑なデータ操作もSQL4Gであれば簡単に処理できます。一方、サービス全体を横断する巨大なエンティティであればBigTableの出番です。
機能やデータの性質に応じ、適材適所のデータベース設計を行ってください。
SQL4Gライブラリ(jarファイル)に組み込まれている為、GAEアプリケーションにjarファイルを置くだけでSQL4G Database Adminを利用することができます。
また、GAEクラウド環境へそのままディプロイ可能。GAE内のSQL4Gデータベースをビジュアルに操作できるリトルソフトオリジナルのクラウド・ウェアです。

SQL4G Database Adminは以下のブラウザで動作を確認しています。
社員一覧編集や勤務表入力を行うデモです。
⇒⇒ デモを開始する
軽量AJAX+Javaフレームワーク LittleSoft J-Programmingに付属するサンプルアプリケーションと基本的に同じものですが、 web.xmlのサーブレット初期化パラメータの設定とJDBCコネクションの取得方法を変更するだけでGAEへの対応を実現させています。
SQL4Gライブラリの組込みアドミニストレーター用ツール
⇒⇒ デモを開始する
LSJ Sample Applicationの社員テーブルや所属テーブルをブラウズできます。左上のデータベースメニューからLS_SAMPLEDBをオープンしてください。(パスワードは"ls"を入力してください)
SQL4G(Database Adminを含む)のダウンロードはこちらから。
Eclipseを起動し、「 Google App Engine - Google Code 」を参考に、Google App Engine Webアプリケーション用のプロジェクトを作成します。
ダウンロードした「 sql4g-xxx.zip 」を解凍し、アーカイブに含まれている全てのファイルを「 /プロジェクト/war/WEB-INF 」配下にコピーします。
次に、コピーした6つのjarファイルをJavaのビルドパスに追加します。
Webサーバーを起動して、以下のURLにアクセスします。
http://localhost:8080/sql4gadmin
データベース管理コンソールアプリケーション「 SQL4G Database Admin 」が起動すればインストール完了です。

「 SQL4G Database Admin 」を利用すると簡単な操作でデータベースを作成することができます。
また、データベース作成のほか、以下のような操作を行うこともできます。
データベースの起動、停止
データベースへの接続、切断
テーブル定義、テーブルデータの参照
任意のSQL文の実行
テーブルデータのインポート、エクスポート
「Database」→「Create New」をクリックし、ダイアログにデータベース名、ユーザーID、パスワードを入力して「OK」をクリックすると、新規データベースが作成されます。
データベース名は大文字アルファベットと数字をつかった任意の名前を設定することができます。また、アプリケーション プログラムがSQL4Gデータベースへ接続する際は、ここで設定したデータベース名、ユーザーID、パスワードを指定します。
ツリーでデータベースをクリック後、「Database」→「Open」をクリックしてダイアログにパスワードを入力して「OK」をクリックしてデータベースに接続します。
ツリーでデータベースをクリック後、「Database」→「Close」をクリックしてデータベースに接続を切断します。
ツリーでデータベースをクリック後、「Database」→「Startup」をクリックしてダイアログにパスワードを入力して「OK」をクリックしてデータベースを起動します。
ツリーでデータベースをクリック後、「Database」→「Shutdown」をクリックしてデータベースを停止します。
「Database」→「Refresh」をクリックして表示を更新します。
ウインドウ左上のツリーは、データベース構造を表示しています。
[ SQL4G ]
- データベース1
- スキーマ1
- テーブル1
- テーブル2
- データベース2
- スキーマ2
- テーブル3
- テーブル4
ツリーでテーブル名をクリックすると、ウインドウ左下にテーブル定義が表示されます。
1. ウインドウ上部の「Table Viewer」タブをクリックして、データ参照画面を開きます。
2. ツリーでテーブル名をクリックすると、参照画面にテーブルデータが表示されます。
3. データは100件まで表示されます。「First」「Prev」「Next」「Last」をクリックすることで表示しているページを切り替えることが可能です。
1. あらかじめ、データベースに接続しておきます。
2. ウインドウ上部の「SQL Window」タブをクリックして、SQL実行画面を開きます。
3. テキストエリアに任意のSQL文を記述します。
4. 「Execute」をクリックするとSQL文が実行され、結果が一覧に表示(SELECT文のみ)されます。その際、トランザクションは自動的にコミットされます。
以下のようなプログラミングでSQL4Gデータベースへ接続を行います。
// JDBCドライバーをロード
Class.forName("jp.littlesoft.sql4g.Driver");
// コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection("MYSQL4G_DB", "SA", "password");
:
Google App Engineの制限によりjavax.sql.DataSourceインターフェースを実装したAPIはSQL4Gには含まれていませんが、 上記の方法で取得したコネクションオブジェクトはプールされたコネクションか返されていますので、Webアプリケーションの中で問題なく使用することができます。
尚、SQL4Gデータベースは、コネクションのクローズ処理を契機として更新ロックオブジェクトを開放を行います。 この為、コネクションの使用が終わったら、確実にクローズ処理を行ってください。
Connection conn = DriverManager.getConnection(...
try {
...
} finally {
try {conn.close();} catch (Exception x) {};
}
SQL4Gデータベースは各種ステートメントオブジェクトの作成、結果セットの利用方法など、標準JDBC APIに準拠したプログラミングで操作することができます。
SQL4Gデータベースは、基本的にH2 Database EngineがサポートするSQL文を全てサポートします。
H2 Database EngineのSQLに関する詳細情報は、H2プロジェクト Webサイトの SQL Grammarをご覧下さい。
尚、ローカルファイルに書込みアクセスが発生するコマンドなど、GAE環境の制限されるものについてはSQL4Gでは使用できません。 また、H2 Database Engineに用意されているロックモード変更、トレースファイル出力などのオプション機能もSQL4Gでは使用できませんので、注意してください。