在Glassfish下运行多个Grails应用程序时出错

时间:2012-01-08 14:07:15

标签: java grails glassfish

我使用Grails(V2.0.0.RC1)编写了两个小的hello world应用程序,我想使用Glassfish(v3.1)部署它们。

如果我在Glassfish上单独部署其中一个应用程序,应用程序就可以正常运行,我可以在http://t1-0.1http://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不会抱怨让我有两个可以协同工作的应用程序)。但也许我误读了错误信息?有人有什么建议吗?

1 个答案:

答案 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"
    }
}

当然,在生产代码中,您最终可能会引用一个真实的数据库,然后您的应用程序自然会在其数据库引用中合作。