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

Java 在Glassfish下运行多个Grails应用程序时出错,java,grails,glassfish,Java,Grails,Glassfish,我已经使用Grails(V2.0.0.RC1)编写了两个HelloWorld小应用程序,我想使用Glassfish(v3.1)部署它们 如果我将它部署到Glassfish上的任何一个应用程序上,应用程序都可以正常工作,我可以在http://t1-0.1或athttp://t2-0.1。但是,如果我部署其中一个应用程序,然后部署另一个(以便访问我的网站的人可以使用这两个应用程序),则第二个部署命令会显示以下错误消息: c:>asadmin部署t2-0.1.0 远程故障:部署期间发生错误:部署时发生

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

如果我将它部署到Glassfish上的任何一个应用程序上,应用程序都可以正常工作,我可以在
http://t1-0.1
或at
http://t2-0.1
。但是,如果我部署其中一个应用程序,然后部署另一个(以便访问我的网站的人可以使用这两个应用程序),则第二个部署命令会显示以下错误消息:

c:>asadmin部署t2-0.1.0

远程故障:部署期间发生错误:部署时发生异常 加载应用程序: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:错误创建 名为“hibernateProperties”的bean:无法解析对的引用 设置bean属性“properties”时使用 键[休眠.方言];嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“方言检测器”的bean:调用init 方法失败;嵌套异常是 org.springframework.jdbc.support.MetaDataAccessException:运行时出错 提取数据库元数据;嵌套异常是 org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(数据库可能已被使用):“锁定 可能的解决方案:关闭所有其他连接; 使用服务器模式;SQL 语句:null/1349c415392c6dc06a3e7086cd1bb075c7881fc0650 [90020-147]). 有关详细信息,请参阅server.log


这是怎么回事?我认为Grails及其Hibernate的使用有一些特殊之处(因为如果不是这样,Glassfish不会抱怨允许我有两个可以一起工作的应用程序)。但也许我误读了错误信息?有人有什么建议吗?

事实证明,问题在于我滥用了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"
    }
}

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

您可以发布您的glassfish持久性提供程序配置吗?通常情况下,应用程序不会直接通过glassfish api访问数据库——我想问题就在这里。您的grailsdb配置也将非常有用。