1

我试图在本指南的帮助下在 grails 控制台中创建一个新的域对象。根据控制台输出创建新对象:

grails> shell
groovy:000> new foo.Book(title: 'bar').save(failOnError: true, flush: true)
groovy:000> foo.Book : 1
groovy:000> foo.Book.list()
groovy:000> [foo.Book : 1]

但是这个新书实体在 dbconsole 中不可见当我使用 DataSource.groovy 中找到的开发环境的 JDBC url 连接时,表 BOOK 存在:

jdbc:h2:mem:devDb;MVCC=TRUE
username: sa
password: <blank>

但选择返回 0 行

相关的 DataSource.groovy 配置(默认)

dataSource {
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""
}
hibernate {
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
//    cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
}

// environment specific settings
environments {
    development {
        dataSource {
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
        }
    }

当使用控制台而不是 groovy shell 创建实体时,问题仍然存在。

我目前正在使用最新的 grails 版本,即 2.3.1
嵌入式 H2 数据库 vrsion = H2 1.3.173 (2013-07-28)

4

3 回答 3

5

我认为问题是数据库被锁定了。那么让我们试试这个(适用于我的实验):

编辑您的 grails-app/conf/spring/resources.groovy 并使其看起来像这样:

// Place your Spring DSL code here
beans = {
    h2Server(org.h2.tools.Server, "-tcp,-tcpPort,8043") { bean ->
        bean.factoryMethod = "createTcpServer"
        bean.initMethod = "start"
        bean.destroyMethod = "stop"
    }
}

然后,将 grails-app/conf/DataSource.groovy 修改为如下所示:

test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
        }
}

现在,您已准备好按照教程添加一些新对象:

$ grails
grails> run-app
grails> shell
groovy:000> new test.Book(title: 'Book 1').save(failOnError: true)
===> test.Book : 1
groovy:000> new test.Book(title: 'Book 2').save(failOnError: true)
===> test.Book : 2
groovy:000> test.Book.list()
===> [test.Book : 1, test.Book : 2]

要查看 H2 控制台,请转到

http://localhost:8080/{project}/dbconsole 

但从列表中选择 [Generic H2 Server] 并在 JDBC URL 上输入:

jdbc:h2:tcp://localhost:8043/mem:devDb 

并连接。我希望这会有所帮助

=======================

经过进一步的实验,似乎锁定是您的问题,您需要在连接到 H2 时使用混合模式方法。您可以在此处阅读更多信息:

http://www.h2database.com/html/features.html#auto_mixed_mode

所以,最简单的做法是使用这个 jdbc 连接 URL:

url = "jdbc:h2:/tmp/myDB;MVCC=TRUE;LOCK_TIMEOUT=10000;AUTO_SERVER=TRUE"

对于您的应用程序和 H2 dbconsole(注意 AUTO_SERVER=TRUE)(无需修改 spring bean)

于 2013-10-25T15:44:10.267 回答
0

当我按照尼克的建议修改 spring bean 时,我无法启动 run-app 并同时启动 grails 控制台或 shell。这是我得到的错误:

消息:创建名为“h2Server”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.h2.jdbc.JdbcSQLException:异常打开端口“8043”(端口可能正在使用),原因:“java.net.BindException:地址已在使用”[90061-173]

对 url 的简单更改有效,感谢 Nick -:)

于 2014-04-08T12:47:19.923 回答
0

我建议改变

dbCreate = "创建-删除"

dbCreate = "更新"

在您的 DataSource.groovy 上,然后重试

于 2013-10-23T15:15:51.557 回答