【问题标题】:Error while running multiple Grails apps under Glassfish在 Glassfish 下运行多个 Grails 应用程序时出错
【发布时间】:2012-02-05 09:13:48
【问题描述】:

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

如果我在 Glassfish 上单独部署其中一个应用程序,则该应用程序运行良好,我可以通过 http://t1-0.1http://t2-0.1 访问它。但是,如果我部署其中一个应用程序,然后部署另一个应用程序(以便访问我的网站的人都可以使用这两个应用程序),那么第二个部署命令会给我以下错误消息:

c:>asadmin 部署 t2-0.1.war

远程失败:部署期间发生错误:出现异常 加载应用程序:java.lang.IllegalStateException: ContainerBase.addChild:开始: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 'hibernateProperties' 同时设置 bean 属性 '休眠属性';嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误创建 名称为“hibernateProperties”的 bean:无法解析对 bean'dialectDetector'同时设置bean属性'properties' 键[hibernate.dialect];嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为“dialectDetector”的bean:调用init 方法失败;嵌套异常是 org.springframework.jdbc.support.MetaDataAccessException:出错时 提取数据库元数据;嵌套异常是 org.apache.commons.dbcp.SQLNestedException:无法创建 PoolableConnectionFactory(数据库可能已经在使用中:“被锁定 另一个进程”。可能的解决方案:关闭所有其他连接; 使用服务器模式; SQL 声明:空/1349c415392c6dc06a3e7086cd1bb075c7881fc0650 [90020-147])。有关详细信息,请参阅 server.log。

这里发生了什么?我认为 Grails 及其对 Hibernate 的使用有一些特殊之处(否则 Glassfish 不会抱怨允许我拥有两个可以一起工作的应用程序)。但也许我误读了错误信息?有人有什么建议吗?

【问题讨论】:

  • 您能否发布您的 glassfish 持久性提供程序配置?通常,应用程序不直接通过 glassfish api 访问数据库 - 我猜问题出在此处。您的 Grails DB 配置也会很有帮助。

标签: java grails glassfish


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    相关资源
    最近更新 更多