WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート GAE

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

[GAE]Servletとsigleton

2010-06-27 22:23

GAEの話題というよりServletの話題です。Servletはリクエストの度に毎回起動されるのではなく、使いまわされませす。例えばjavax.servlet.Filterのinit()に


public void init(FilterConfig config) throws ServletException
{
System.out.println("init");
}
とやってもブラウザで読み込み直すたびに表示されたりしません。どういうタイミングでクラスが読み込みなおされるのか、詳しく調べきれてないのですが、クラスローダーとかが関係してるのでしょうか。
とにかく、毎回リクエストの度にすべてのクラス群が新しく起動されるのではないということです。
だとするとSingletonでクラスを設計するときにも注意が必要です。Singletonは多人数のリクエストで共有されるということです。

public class Singleton
{
private static Singleton instance = new Singleton();

private Singleton(){
System.out.println("create singleton");
}

public static Singleton getInstance()
{
return instance;
}
}
こんなクラスを作ってgetInstanceを呼び出してみましたが、さっきのinitの例と同様デプロイした直後しかprintlnは表示されません。

Singletonはまさにその名の通り、「インスタンスの存在数を限定する」というデザインパターンですが、「いつでも、どこでも、対象のインスタンスが手に入る」という利点もあったりして重宝してたのですが、Servletでの使用に注意が必要です。

というか、「複数のリクエストで共通のインスタンス」というのが使いどころをあまり思い浮かばないので、ServletでSingletonはむずかしい、というのが正直な感想です。

    このエントリーをはてなブックマークに追加

Entityを保存するとき、Keyを指定しなければ数字を勝手に振ってくれますが、自分で指定することもできます。例えばUser Entityでuser_idのような文字列をKeyにしていするなんてことが考えられますが、RDBになれた私たちにとってはちょっと思いがけない挙動をします。

次のコードを見てください


DatastoreService ds = DatastoreServiceFactory.getDatastoreService();

Entity entity1 = new Entity("Test", "uniqueKey");
entity1.setProperty("name", "foo");
ds.put(entity1);

//同じキーで新規にEntityを作る
Entity entity2 = new Entity("Test", "uniqueKey");
entity2.setProperty("name", "bar");
ds.put(entity2);

Entity check1 = ds.get(KeyFactory.createKey("Test", "uniqueKey"));
System.out.println(check1.getProperty("name"));//これはbar

Query query = new Query("Test")
.addFilter("name", FilterOperator.EQUAL, "foo");

Entity check2 = ds.prepare(query).asSingleEntity();

System.out.println(check2);//これはnull
同じキーでEntityを作成するとなにも警告なく前会ったキーを上書きます。ユニーク制約もそうですが、自分で事前に取得して確認しないとダメでしょう。

    このエントリーをはてなブックマークに追加

今ごろですけど、最近Google App Engineをいじってます。やっぱり(自分にとって)新しいものを触るのはなんかワクワクしますね。

ローカルのビルトインサーバーで変更しても反映されなくなってしまって、原因を見つけたので書いておきます。

基本的に、jspの変更はサーバーの停止無しで、ServeletやClassの変更はサーバーを再起動で反映されるんですけど、Servletの変更が全く反映されなくなりました。どうやら、複数のサーバーが起動してしまったためのようでした。

ctrl+shift+escでタスクマネージャを起動し、プロセスのタブに移動
javax.exe
というのが複数あったら、終了してみてください。

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。