PersistenceManagerインスタンスの寿命
Google App Engine for Java アプリのレスポンスが5秒程待たされる場合があるのですが、原因を調べてみるとPersistenceManagerインスタンスの取得に時間がかかってしまい結果レスポンスが落ちるようです。
PersistenceManagerインスタンスはおよそ2分程でその寿命が尽きてしまいその後インスタンス取得の処理が走ると新たにインスタンスを生成しています。PersistenceManagerインスタンスの取得は高価で新規のインスタンス取得には大体2秒程度かかります。アプリケーションが常に動いているならばインスタンスの寿命が尽きる事はないのですが、私のアプリのようにあまり使用されていない場合は頻繁にPersistenceManagerインスタンスの寿命が尽きてしまいます。
そこでインスタンスの寿命が尽きてしまわないようcronで定期的にPersistenceManagerインスタンスを取得するようにしました。ソースは以下のような感じ。
package simplebookmarks.servlet; import java.io.IOException; import java.util.logging.Logger; import javax.jdo.PersistenceManager; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import simplebookmarks.PMF; public class CronServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger logger = Logger.getLogger(CronServlet.class.getName()); public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { PersistenceManager pm = null; try { pm = PMF.get().getPersistenceManager(); } finally { pm.close(); } logger.info("PMF.get().getPersistenceManager() : ok."); req.getRequestDispatcher("/cron.jsp").forward(req, resp); } }
cron.xmlはこんな感じで。
<?xml version="1.0" encoding="UTF-8"?> <cronentries> <cron> <url>/cron</url> <description>Pool the instance every 2 minutes</description> <schedule>every 2 minutes</schedule> </cron> </cronentries>
これで快適にアプリを利用出来るようになりました。
*ひょっとしたら何かしらオプション指定でインスタンスの寿命を延ばすことが出来るかも?