Grails с JDO - как правильно работать с PersistenceManager - PullRequest
0 голосов
/ 14 июня 2010

Я создаю приложение с google app engine и grails. У меня есть контроллер, настроенный для вызова приложения Flex. Контроллер вызывает службу, чтобы получить список обратно и отправить его обратно во Flex.

Клиент 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

    }
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2011

Плагин Grails App-Engine создает объект persistenceManager в области запроса. По умолчанию сервисы являются синглетонами, что означает, что они создаются один раз вместо запроса. Таким образом, если вы предоставите своей службе переменную экземпляра persistenceManager, первый запрос будет иметь действительный persistenceManager, но все последующие вызовы будут иметь закрытый persistenceManager, поскольку ваша служба все еще ссылается на менеджера из первого запроса.

Есть два способа исправить это:

1) Измените объем вашего обслуживания. Вы можете сделать это, указав в своем классе обслуживания следующее:

static scope = "request"

2) передать persistenceManager из вашего контроллера в службу, когда вы вызываете метод обслуживания

0 голосов
/ 17 июня 2010

Это очень похоже на код моего контроллера.За исключением того, что я не использую транзакцию = 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>

...