2012-06-17 24 views
3

我有Play 2應用程序中運行的AKKA actors。有一個POJO對象列表從數據庫中檢索並傳遞給參與者。當一個actor開始處理這些對象時,它會拋出這個異常。我想它試圖從數據庫讀取數據,因爲ebean的延遲加載。在測試用例中運行時發生這種情況。我沒有在正常的應用程序環境中測試。Play 2.0試圖從已經關機的池中獲取連接

試圖獲得一個池已經被關閉

at com.avaje.ebeaninternal.server.transaction.TransactionManager.createQueryTransaction(TransactionManager.java:356) 
at com.avaje.ebeaninternal.server.core.DefaultServer.createQueryTransaction(DefaultServer.java:2021) 
at com.avaje.ebeaninternal.server.core.OrmQueryRequest.initTransIfRequired(OrmQueryRequest.java:241) 
at com.avaje.ebeaninternal.server.core.DefaultServer.findList(DefaultServer.java:1468) 
at com.avaje.ebeaninternal.server.core.DefaultBeanLoader.loadBean(DefaultBeanLoader.java:360) 
at com.avaje.ebeaninternal.server.core.DefaultServer.loadBean(DefaultServer.java:526) 
at com.avaje.ebeaninternal.server.loadcontext.DLoadBeanContext.loadBean(DLoadBeanContext.java:143) 
at com.avaje.ebean.bean.EntityBeanIntercept.loadBean(EntityBeanIntercept.java:548) 
at com.avaje.ebean.bean.EntityBeanIntercept.preGetter(EntityBeanIntercept.java:638) 
at models.MemberInfo._ebean_get_type(MemberInfo.java:4) 
at models.MemberInfo.getType(MemberInfo.java:232) 
at actors.MessageWorker.doSendToIOS(MessageWorker.java:161) 
at actors.MessageWorker.onReceive(MessageWorker.java:97) 
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:154) 
at akka.actor.UntypedActor$$anonfun$receive$1.apply(UntypedActor.scala:153) 
at akka.actor.Actor$class.apply(Actor.scala:311) 
at akka.actor.UntypedActor.apply(UntypedActor.scala:93) 
at akka.actor.ActorCell.invoke(ActorCell.scala:619) 
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:196) 
at akka.dispatch.Mailbox.run(Mailbox.scala:178) 
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:505) 
at akka.jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:259) 
at akka.jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:974) 
at akka.jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1478) 
at akka.jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104) 
+0

Akka將序列化演員的狀態。你是否需要應用程序的這部分是有狀態的?如果不是,那麼也許最好使用演員以外的東西。 –

+0

你的意思是我不應該用演員來連接數據庫嗎? – angelokh

+0

如果需要,您絕對可以從演員連接到數據庫。它看起來像你的堆棧跟蹤,它不是序列化,而是觸發lazy屬性,而是'MemberInfo.getType'方法中的一些東西。是對的嗎? –

回答

1

雖然我不知道這是否是相關的,你,我會告訴我的故事的連接。在運行我的測試用例時,我沒有使用參與者,但是出現了相同的錯誤消息。

首先請注意,在停止播放應用程序時,其數據源將關閉。

由於我的許多測試用例需要在範圍內運行Application,因此我在每個測試用例附近都使用了WithApplication助手。在我的情況下,問題是我的DB訪問對象是一個單例(Scala object),它只初始化它的Datasource一次。由於該對象從來沒有在測試用例之間重新實例化,所以封閉的數據源保持在那裏,導致上述錯誤。

我的解決方案是確保數據源在測試用例之間重新創建。

相關問題