Hibernate 冬眠&;ehcache在JBoss 4.2.1.GA上的Grails下使用读写

Hibernate 冬眠&;ehcache在JBoss 4.2.1.GA上的Grails下使用读写,hibernate,grails,jboss,ehcache,Hibernate,Grails,Jboss,Ehcache,我很难在Grails下获得hibernate的二级缓存 因此,我有一个使用Grails1.3.5的应用程序,它将部署在JBoss4.2.1.GA上 应用服务器的选择不是我的,因此很遗憾无法更改/升级 最初,我只是打开了第二级和查询缓存,并将提供程序设置为EhCache 然后,我的查询和实体被适当地标记为缓存,我正在使用读写策略,因为它们会随着时间的推移而改变 当我将web应用程序部署到JBoss并启动它时,会输出以下警告: 21:24:36585信息[TransactionManagerLook

我很难在Grails下获得hibernate的二级缓存

因此,我有一个使用Grails1.3.5的应用程序,它将部署在JBoss4.2.1.GA上

应用服务器的选择不是我的,因此很遗憾无法更改/升级

最初,我只是打开了第二级和查询缓存,并将提供程序设置为EhCache

然后,我的查询和实体被适当地标记为缓存,我正在使用读写策略,因为它们会随着时间的推移而改变

当我将web应用程序部署到JBoss并启动它时,会输出以下警告:

21:24:36585信息[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更多

现在我有了一个谷歌,有人说这是因为在web应用程序中包含了jta.jar

因此,我在BuidConfig.groovy文件中使用这个groovy脚本删除了它(还删除了让它在JBoss上工作所需的日志jar):

然而,这不起作用,我得到了完全相同的错误


任何帮助都将受到感激。我花了很长时间在谷歌上搜索,但没有成功。这并不是我在JBoss上工作的第一点痛苦,我相信这不会是最后一点痛苦

发现了这个问题,我实际上应该删除jta-1.1.jar文件。成功了

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)
    }
}