【发布时间】:2011-05-08 18:05:34
【问题描述】:
我很难为在 Grails 下工作的休眠获取二级缓存。
所以我有一个使用 Grails 1.3.5 的应用程序,它要部署在 JBoss 4.2.1.GA 上。
应用服务器的选择不是我的,所以很遗憾无法更改/升级。
原来我只是简单的开启二级和查询缓存并将提供者设置为EhCache。
然后我的查询和实体被适当地标记为缓存,我正在使用 READ_WRITE 策略,因为它们会随着时间而改变。
当我将 Web 应用程序部署到 JBoss 并启动它时,会输出以下警告:
21:24:36,585 INFO [TransactionManagerLookupFactory] 未配置 TransactionManagerLookup(在 JTA 环境中,不建议使用读写或事务二级缓存)
现在这确实导致了一个真正的问题。我有一个数据导入服务,它将在单个事务中更新系统中的几乎每个实体。运行可能需要一些时间,但在进程提交之前我不会显示编辑。
现在,当在 tomcat 中以开发模式(即 grails run-app)运行时,这可以正常工作。
但是在 JBoss 中,编辑一旦在缓存中进行就可以使用,而不是在事务提交时。
我假设这是因为上面显示的 JTA 环境警告。
现在我尝试通过为休眠添加事务工厂类和查找管理器来解决此问题。
DataSource.groovy 中的相关 sn-p 是:
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:创建名为“transactionManager”的bean时出错:设置bean属性“sessionFactory”时无法解析对bean“sessionFactory”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为“sessionFactory”的 bean 时出错:调用 init 方法失败;嵌套异常是 java.lang.ClassCastException: com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate 不能转换为 javax.transaction.TransactionManager ... 129 更多
现在我有一个 google,有人建议这是由于在 web 应用程序中包含 jta.jar 引起的。
所以我使用 BuidConfig.groovy 文件中的这个 groovy 脚本删除了它(也删除了日志 jar,需要让它在 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 上工作时遇到的第一次痛苦,我相信这不会是最后一次!
【问题讨论】:
标签: hibernate grails jboss ehcache