2010-06-14 44 views
0

我正在用谷歌應用程序引擎和grails創建一個應用程序。我爲我的Flex應用程序設置了一個Controller來調用。 Controller調用一個服務來獲取列表並將其發送回Flex。grails與JDO - 我如何正確使用persistenceManager

Flex客戶端能夠將數據返回一次。另外如果我在瀏覽器中調用動作,我可以調用動作並獲取數據。我發現的問題是,它不能多次調用它,因爲應用程序正在使用JDO,在第一次調用之後,我收到一條錯誤,指出persistenceManager已關閉。

我已經閱讀了一些文章,告訴你如何設置一個單一的噸,只是在需要時得到一個persistanceManager的實例,但這似乎也不工作。

這是我第一次使用JDO,我可以使用一些建議,讓這些服務在一致的基礎上工作。

以下是實際查詢數據存儲的服務中的代碼。

package com.dlish.fulcrum 

import com.dlish.fulcrum.PMF 
import org.springframework.beans.factory.InitializingBean 
import com.google.appengine.api.datastore.* 
import com.dlish.fulcrum.Show 

class VenueBlastService { 

    static transactional = true 

    def grailsApplication 
    def setting 

    void afterPropertiesSet() 
    { 
     this.setting = grailsApplication.config.setting 
    } 

    def persistenceManager 

    def getAllShows() {   

     def query = persistenceManager.newQuery(Show) 
     def showInstanceList = query.execute() 

     return showInstanceList 

    } 
} 
+0

從控制器傳遞的PersistenceManager的服務。如果說,這是關閉的,那麼你,或您正在使用的一些軟件稱爲pm.close()。也許春天是這樣做的? – DataNucleus 2010-06-15 07:00:04

回答

0

Grails的應用程序引擎的插件會在要求範圍內的PersistenceManager對象。默認情況下,服務是單例,這意味着它們只創建一次而不是每個請求。因此,如果你給你的服務一個persistenceManager實例變量,第一個請求將有一個有效的persistenceManager,但所有後續的調用將有一個關閉的persistenceManager,因爲你的服務仍然從第一個請求引用管理器。

有兩種方法來解決這個問題:

1)改變您的服務範圍。您可以通過將做到這一點在服務類中的以下內容:

static scope = "request" 

2)當您撥打服務方法

0

這與我的控制器的代碼非常相似。除了我不使用transactional = true之外,爲什麼要這樣做,你只是在做一個閱讀?你使用的是什麼版本的app-engine插件?

這裏是我的jdoconfig.xml:

<?xml version="1.0" encoding="utf-8"?> 

<persistence-manager-factory name="transactions-optional"> 
    <property name="javax.jdo.PersistenceManagerFactoryClass" 
     value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/> 
    <property name="javax.jdo.option.ConnectionURL" value="appengine"/> 
    <property name="javax.jdo.option.NontransactionalRead" value="true"/> 
    <property name="javax.jdo.option.NontransactionalWrite" value="true"/> 
    <property name="javax.jdo.option.RetainValues" value="true"/> 
    <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/> 
</persistence-manager-factory>