获得冬眠和放松ehcache在JBoss 4.2.1.GA上的Grails下使用READ_WRITE

时间:2010-11-11 21:35:43

标签: hibernate grails jboss ehcache

我很难在Grails下使用hibernate获得二级缓存。

所以我有一个使用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环境警告。

现在我尝试通过为hibernate添加事务工厂类和查找管理器来解决此问题。

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:创建名为'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更多

现在我有一个谷歌,有人建议这是由于在网络应用程序中包含了jta.jar。

所以我在BuidConfig.groovy文件中使用这个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 个答案:

答案 0 :(得分:2)

发现这个问题,我应该删除了jta-1.1.jar文件。这就行了!