Мне трудно получить кэш 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, и уверен, что она не будет последней!