2010-01-02 159 views
1

我對剛剛檢索到的對象列表的JDO持久性存在一些問題。Google App Engine(Java)+ Spring managed PersistenceManager

我想要做的是:

  • 取 「訂單」 的列表
  • 修改一個屬性 「地位」
  • 讓 「訂單」

的批量更新什麼我到目前爲止是「帶有ID的對象...由不同的對象管理器」管理。 但是等一下,沒有春天我沒有遇到過這樣的問題!

我試圖調試它是這樣的:

List<Orderr> orders = orderDao.findByIdAll(ordersKeys); 
for(Orderr o : orders) { 
    System.out.println(JDOHelper.getPersistenceManager(o).hashCode()); 
    //hashcode is 1524670 
    o.setSomething(somevalue); 
} 
orderDao.makePresistentAll(orders); //hashcode inside is 31778523 

makePersistentAll什麼也不做,但:

try { 
    System.out.println(getPersistenceManager().hashCode()); 
    getPersistenceManager().makePersistentAll(entities); 
} finally { 
    getPersistenceManager().close(); 
} 

我所有的DAO延長JdoDaoSupport。 Pmf由春季注入和管理。

最後,這裏是一個問題:爲什麼在findByIdAll之後關閉持久性管理器?或者爲什麼我會得到新的持久性管理器實例?當然,我的findByIdAll方法不會在持久性管理器上調用close。

當然,如果我爲每個「訂單」調用makePersistent,它的效果很好。但是它破壞分層業務和數據庫邏輯的...

UPD 剛剛發現到makePersistentAll所有呼叫都沒有在所有後Spring管理PersistenceManager的遷移工作。在春天之前,我使用普通的舊PMF.get()幫手,一切都很有光澤!

回答

1

如果您的應用程序在響應HTTP請求的響應時間超過30秒時保持活動狀態,它將被終止。 GAE的部分操作模式是,您的應用程序不是長久的。完全一樣。

雖然你不會在自己的網站上做到這一點,但你必須習慣於只能短期訪問數據庫會話管理器。有時候需要很多時間來重新打開每個事務,但這就是GAE如何使流程可擴展的。如果您真的有很多流量,它可以在多臺服務器上並行運行您的應用程序。

+0

雖然我正在開發GAE應用程序,但它並不特定於它。我在localhost SDK上有同樣的事情(除了Jetty)。我認爲,正如你所說,「數據庫會話管理器」是PersistenceManagerFactory,但不是PersistenceManager。我可以從每個對象中獲取舊的PersistenceManager,但這不是我應該這樣做的方式。這意味着它根本沒有關閉,但我猜春天是從dao中移除的。 – vshulyak 2010-01-02 21:04:42

+0

嗯。那麼我認爲我們已經超越了我的能力來幫助你。我在GAE應用程序中使用了一些Spring,但我們的關係並不樂觀。對不起,祝你好運! – 2010-01-02 21:27:02

+0

謝謝!是的,這個問題並不明顯...... – vshulyak 2010-01-02 21:33:31

0

這是一種魔法。每次我在這裏問一個問題,我都會在發佈後的24小時內知道我的問題的答案。

當然,工廠的意義應該總是創建一個新的pm實例。現在我保存參考我以前的下午(就像我在春天jdo daos之前做的),並且每個都可以。