2010-01-07 23 views
2

有沒有一種方法可以確保在同一RPC請求的上下文中執行的不同代碼部分中使用相同的PersistenceManager實例?如何總是在Google App Engine的相同RPC請求中使用相同的PersistenceManager

具有功能手動處理出來的持久性管理器實例函數是一個相當痛苦:

例如:

private void updateItem(ItemModel listItem) 
     throws UserNotLoggedInException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    if (isItemIsNew(pm, listItem)) { 
     workOnItem(pm, listItem); 
    } 
    workSomeMoreOnItem(pm, listItem); 

} 

回答

2

谷歌食譜提供了以下答案:

使用一個過濾器,您可以使PersistenceManager可用,並確保它在請求結束時關閉。如果您正在使用爲您處理渲染的MVC框架(如Spring),那麼這對於讓管理器保持足夠長的時間以使View仍能夠獲取尚未被訪問的持久對象也很有用。

public final class PersistenceFilter implements Filter { 
    private static final PersistenceManagerFactory persistenceManagerFactory 
     = JDOHelper.getPersistenceManagerFactory("transactions-optional"); 

    private static PersistenceManagerFactory factory() { 
     return persistenceManagerFactory; 
    } 

    private static ThreadLocal currentManager = new ThreadLocal(); 

    public static PersistenceManager getManager() { 
     if (currentManager.get() == null) { 
      currentManager.set(factory().getPersistenceManager()); 
     } 
     return currentManager.get(); 
    } 
    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 
     PersistenceManager manager = null; 
     try { 
      manager = getManager(); 
      //Optional: allow all persistent objects implementing a custom interface 
      //to be notified of when they are saved and loaded. 
      manager.addInstanceLifecycleListener(new PersistHookListener(), PersistHooks.class); 
      chain.doFilter(req, res); 
     } finally { 
      if (manager != null) { 
       manager.flush(); 
       manager.close(); 
      } 
     } 
    } 
    @Override 
    public void init(FilterConfig arg0) throws ServletException {} 
    @Override 
    public void destroy() {} 
} 

http://appengine-cookbook.appspot.com/recipe/persistencefilter/?id=ahJhcHBlbmdpbmUtY29va2Jvb2tyigELEgtSZWNpcGVJbmRleCI2YWhKaGNIQmxibWRwYm1VdFkyOXZhMkp2YjJ0eUVnc1NDRU5oZEdWbmIzSjVJZ1JLWVhaaERBDAsSBlJlY2lwZSI3YWhKaGNIQmxibWRwYm1VdFkyOXZhMkp2YjJ0eUVnc1NDRU5oZEdWbmIzSjVJZ1JLWVhaaERBMAw

相關問題