我使用Grails(V2.0.0.RC1)编写了两个小的hello world应用程序,我想使用Glassfish(v3.1)部署它们。
如果我在Glassfish上单独部署其中一个应用程序,应用程序就可以正常运行,我可以在http://t1-0.1
或http://t2-0.1
访问它。但是,如果我部署其中一个应用程序,然后部署另一个应用程序(以便两者都可以访问我的网站),那么第二个部署命令会给我以下错误消息:
c:> asadmin deploy t2-0.1.war
远程故障:部署期间发生错误:异常时 加载应用程序:java.lang.IllegalStateException: ContainerBase.addChild:start:org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException:错误 创建名为'transactionManagerPostProcessor'的bean: bean的初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'transactionManager'的bean:无法解析引用 设置bean属性'sessionFactory'时bean'sessionFactory'; 嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'sessionFactory'的bean:无法解析对它的引用 设置bean属性时bean'hibernateProperties' 'hibernateProperties';嵌套异常是 org.springframework.beans.factory.BeanCreationException:Errorcreating 名为'hibernateProperties'的bean:无法解析引用 bean'dialectDetector'用bean设置bean属性'properties' key [hibernate.dialect];嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'dialectDetector'的bean:init的调用 methodfailed;嵌套异常是 org.springframework.jdbc.support.MetaDataAccessException:同时出错 提取DatabaseMetaData;嵌套异常是 org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(数据库可能已在使用中:“已锁定 另一个过程“。可能的解决方案:关闭其他连接; 使用服务器模式; SQL 声明:空/ 1349c415392c6dc06a3e7086cd1bb075c7881fc0650 [90020-147])。有关更多详细信息,请参阅server.log。
这里发生了什么?我认为Grails有一些特殊之处及其对Hibernate的使用(因为否则Glassfish不会抱怨让我有两个可以协同工作的应用程序)。但也许我误读了错误信息?有人有什么建议吗?
答案 0 :(得分:0)
事实证明,问题在于我滥用Grails提供的默认配置。在DataSource.groovy文件中,每个应用程序都有一个指向数据库的指针,默认情况下指针如下所示:
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb;MVCC=TRUE"
}
}
问题是多个应用程序将被赋予相同的配置,并且多个应用程序之间的基于内存的h2数据库引用冲突。因此,一些“hello world”示例应用程序的解决方案是更改其中一个引用。例如:
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:h2:mem:devDb2;MVCC=TRUE"
}
}
当然,在生产代码中,您最终可能会引用一个真实的数据库,然后您的应用程序自然会在其数据库引用中合作。