每个cloudfoundry部署的grails应用程序都会丢失数据库数据

时间:2012-05-17 10:07:00

标签: database grails hsqldb cloudfoundry

我正在使用sts开发grails 2.0.3应用程序。 我开发并且在关闭sts之前我通常在cloudFoundry上部署我的应用程序。 我正在使用HSQLDB,这是DataSource.groovy:

dataSource {
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "mcg"
    password = "mcg"
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = true
    cache.provider_class = 'net.sf.ehcache.hibernate.EhCacheProvider'
}
// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "update" // one of 'create', 'create-drop','update'
            url = "jdbc:h2:file:qhDB"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:file:testDb"
        }
    }
    production {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:file:prodDb"
        }
    }
}

我的问题是,每次将我的应用程序部署到cloudfoundry时,数据库在云端都会变空。

一些建议?

3 个答案:

答案 0 :(得分:2)

@kenota是正确的,但是存在整个实例崩溃并重建的额外风险,因此即使在/ tmp中也会丢失所有文件系统文件。使用MySQL或PostgreSQL要好得多 - 两者在CloudFoundry中都很容易使用,而且性能会更好。此外,如果您有足够的流量需要多个Web服务器实例,您将共享一个数据库而不是多个基于文件的数据库,这些数据库都具有不同的数据。

答案 1 :(得分:1)

通过这样做:

url = "jdbc:h2:file:prodDb"

您要求H2使用文件存储数据。但问题是,您正在使用相对路径,因此该文件将在Web应用程序的当前工作目录中创建,该目录通常是解压缩的Web应用程序根目录。

如果您在tomcat上运行它,该文件将位于:/ opt / tomcat7 / webapps / app / prodDb如果您将重新部署应用程序并删除之前的应用程序,则数据库文件也将被删除。

我认为这正是cloudfoundry上发生的事情。

您应该定义存储数据库的绝对路径:

url = "jdbc:h2:file:/tmp/prodDb"

答案 2 :(得分:1)

我解决了在cloudfoundy上使用MySQL服务的问题。