Получение hibernate & ehcache для работы с READ_WRITE под Grails на JBoss 4.2.1.GA - PullRequest
2 голосов
/ 12 ноября 2010

Мне трудно получить кэш 2-го уровня для гибернации, работающей под Grails.

Итак, у меня есть приложение, использующее Grails 1.3.5, которое должно быть развернуто на JBoss 4.2.1.GA.

Выбор сервера приложений не мой, и поэтому, к сожалению, его нельзя изменить / обновить.

Первоначально я просто включил второй уровень и кэш запросов и установил для провайдера значение EhCache.

Мои запросы и сущности были затем соответствующим образом размечены для кэширования, и я использую стратегию READ_WRITE, поскольку они со временем изменятся.

Когда я развернул веб-приложение в JBoss и запустил его, это вывело быследующее предупреждение:

21: 24: 36,585 INFO [TransactionManagerLookupFactory] Нет настроенного TransactionManagerLookup (в среде JTA использование кэша чтения-записи или транзакционного кэша второго уровня не рекомендуется)

Теперь это вызывает реальную проблему.У меня есть служба импорта данных, которая будет обновлять практически все объекты в системе за одну транзакцию.Запуск может занять некоторое время, но я не вижу правки, пока процесс не завершится.

Теперь это работает нормально при запуске в режиме разработки (например, grails run-app) в tomcat.

Однако в JBoss правки доступны, как только они внесены в кэш, а не во время фиксации транзакции.

Я предполагаю, что это из-за предупреждения среды JTA, показанного выше.

Теперь я попытался решить эту проблему, добавив класс фабрики транзакций и менеджер поиска для спящего режима.

Соответствующий фрагмент из DataSource.groovy:

hibernate {
    generate_statistics=true
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}

environments {

    ...

    production {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop','update'
            url = "jdbc:mysql://localhost:3306/myschema"
            driverClassName = "com.mysql.jdbc.Driver" 
            username = "root"
            password = "password"
    }
    hibernate {
        transaction.factory_class = "org.hibernate.transaction.JTATransactionFactory"
        transaction.manager_lookup_class = "org.hibernate.transaction.JBossTransactionManagerLookup"
    }
}

}

Проблема в том, что когда я сейчас пытаюсь развернуть приложение, я получаю это ClassCastException:

Причина: org.springframework.beans.factory.BeanCreationException: Ошибка при создании компонента с именем'actionManager ': невозможно разрешить ссылку на компонент' sessionFactory 'при установке свойства компонента' sessionFactory ';вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании компонента с именем 'sessionFactory': сбой вызова метода init;вложенное исключение: java.lang.ClassCastException: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate не может быть приведено к javax.transaction.TransactionManager ... 129 more

сейчасУ меня был Google, и кто-то предположил, что это было вызвано включением jta.jar в веб-приложение.

Поэтому я удалил его с помощью этого скрипта groovy в файле BuidConfig.groovy (также удаляет файлы журналов регистрации,требуется, чтобы он работал на JBoss):

grails.war.resources = {stagingDir ->
    // Extra Libraries to remove
    def toRemove = ["$stagingDir/WEB-INF/lib/log4j-1.2.15.jar",
    "$stagingDir/WEB-INF/lib/slf4j-log4j12-1.5.8.jar",
    "$stagingDir/WEB-INF/lib/slf4j-api-1.5.8.jar",
    "$stagingDir/WEB-INF/lib/jta.jar"].each {
        delete(file: it)
    }
}

Однако это не сработало, и я получил точно такую ​​же ошибку.

Любая помощь будет с благодарностью получена.Потратил довольно много времени на поиски безуспешно.Это не первая боль, которую я испытывал, работая над JBoss, и уверен, что она не будет последней!

1 Ответ

2 голосов
/ 13 ноября 2010

Нашел проблему с этим, я должен был фактически удалить файл jta-1.1.jar.Это добилось цели!

...