2009年9月30日水曜日

InvocationTargetExceptionのその後

以前書いたInvocationTargetExceptionがよく起こる点について、GAE/JのGoogle Groupsを見ていたら、同じようなことで悩んでるスレッド発見。

Startup takes forever - Google App Engine for Java | Google Groups
new stack traces after upgrading to SDK 1.2.5 - Google App Engine for Java | Google Groups

後者の方で言われているが、スレッドがサポートされてないので、やっぱりこの例外はどうしようもないのかもしれないし、クリティカルなものではないからINFOレベルなわけだし。

ただそのとき、CPU時間がグッとあがる点がね・・・。ユーザー数やリクエスト数が増えたときにすぐに無料の範囲を超えないかって気になる。

2009年9月18日金曜日

JDOでListなどのコレクションを取得する時の注意点

Listのプロパティを取得しようとしたら以下のような例外が出た。
javax.jdo.JDODetachedFieldAccessException: You have just attempted to access field "tagNameList" yet this field was not detached when you detached the object. Either dont access this field, or detach it when detaching the object.
 at jp.co.tricell.sonicboom.Mutter.jdoGettagNameList(Mutter.java)
 at jp.co.tricell.sonicboom.Mutter.getTagKeys(Mutter.java:137)
 at jp.co.tricell.sonicboom.rpc.test.TestMutterUtils.testGetMutterOf(TestMutterUtils.java:69)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at junit.framework.TestCase.runTest(TestCase.java:164)
 at junit.framework.TestCase.runBare(TestCase.java:130)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:120)
 at junit.framework.TestSuite.runTest(TestSuite.java:230)
 at junit.framework.TestSuite.run(TestSuite.java:225)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
先日購入した「Google App Engine for Java[実践]クラウドシステム構築」P124に書いてった、
「JDOにはフェッチグループという概念があり、単一のエンティティ内でも一部のプロパティを遅延して取得できます。」
と言うことの意味がこれで分かった。

プリミティブ型、そのラッパークラス、String、Dateといった基本的な型がdefault fetch groupであり、エンティティのプロパティとして「遅延無く」取得できるものなのだ。

今回使用したListはこれらに含まれていないので、自分でdefault fetch groupの指定を追加しない限り、エンティティ取得当初はデータが含まれていないということなんだな。

ということで、例外が出たプロパティに以下のアノテーションを追加。
@Persistent(defaultFetchGroup = "true")
private List<String> tagNameList;
取得成功っと。

さよならウメ子

小田原動物園の象のウメ子が天国へ旅立ってしまった。
東京新聞:突然の悲報、市民ら涙 国内最高齢ゾウ『ウメ子』天国へ 小田原:神奈川(TOKYO Web)

去年小田原に行った時のウメ子。
from Odawara Castle 2008.12.07

初めて小田原城に行った時は正直、なぜ城と象?という感じで、お城のすぐ下に動物園があるっていう光景は少し不思議だった。

でも、ご城下になぜか象がいて、猿がいて、子供たちが遊んでてっていう光景は、北条さんもちょっとびっくりだけどなんだか楽しくていいかもって思ってあるかもよ、なんて思ったりして(^^)。

それからは、小田原に行くときは、まずウメ子、そしてお城に登って、近くにある報徳神社内のcafe Gingerで一息ついて干物を買って帰るというルートが気に入ってたのに・・・。もうウメ子がいないなんて。

ウメ子は昭和25年、推定3歳のときに日本に来て以来59年。現在推定62歳で人間の年齢では約100歳。私なんかよりも長く日本を眺めてきた、ずっとずっと先輩だ。前日まで食べ物も残さず食べるなど元気だったらしいが急に亡くなったらしい。 象ほど大きくて強そうな生き物でも、不意に亡くなってしまうこともある。いつまでも小田原城にはウメ子がいるような気がしていたが、やっぱり変わらないものなんてない。

ウメ子が亡くなると、小田原城下の動物園そのものも閉園になるかもしれないとのこと。『史跡小田原城跡本丸・二の丸整備基本構想』という昔の小田原城を復元しようという構想のなかでは、「史跡にふさわしくない施設」として動物園は整理していくという方針が打ち出されているらしい。
小田原動物園の整理進む一タウンニュース

ウメ子に癒された一人として、小田原動物園という形は変わっても、あの場所が変わらず小田原の人たちの癒しや憩いの場であり続けてほしいと心から願っている。