JDOクエリで例外とその対応
Google App Engine for Java 少しずつ勉強しています。
JDOでBigTableへの問い合わせを下記のようなコードで書いていました。
String query = "select from " + Collection.class.getName() + " where author == '" + user.getEmail() + "'" + " order by displayOrder"; List<Collection> collections = (List<Collection>) pm.newQuery(query).execute();
一応動いているんですが頻繁に例外が発生します。こんな感じで。
09-30 11:41PM 28.654 com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue$SystemLoader loadFinalizer: Not allowed to access system class loader. 09-30 11:41PM 28.667 com.google.appengine.repackaged.com.google.common.base.internal.Finalizer getInheritableThreadLocalsField: Couldn't access Thread.inheritableThreadLocals. Reference finalizer threads will inherit thread local values. 09-30 11:41PM 28.669 com.google.appengine.repackaged.com.google.common.base.FinalizableReferenceQueue <init>: Failed to start reference finalizer thread. Reference cleanup will only occur when new references are created. java.lang.reflect.InvocationTargetException
どうして・・・。理由が分からなくてずっとほったらかしにしていたのですがGAE/Jのドキュメントを読んでいると下記のような書き方も出来るようなので試してみました。
Query query = pm.newQuery(Collection.class); query.setFilter("author == authorParam"); query.setOrdering("displayOrder asc"); query.declareParameters("String authorParam"); List<Collection> collections = (List<Collection>) query.execute(user.getEmail());
すると例外が発生しなくなりました!(今のところ)。アプリがサクサク動いています。これぞGAE/Jだと言わんばかり!
JDOQL 文字列の構文だとその解釈に問題が出たりするのかな?。誰か詳しい人教えて下さい <(_ _)>
と言う訳でクエリは javax.jdo.Query を用いて組み立てるのが吉らしいです。
追記その1:例外はやっぱり出てしまいました。でも前よりは少なくなったような?しばらく様子見と勉強。Memcache を利用するとかの話じゃないよなぁ・・・。
追記その2:id:higayasuoさんよりコメントを頂きました。Finalizerは無視していいとの事。
シンプルなオンラインブックマーク Simple Bookmarks
http://simplebookmarks.appspot.com/