我试图在this guide的帮助下在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中不可见 当我连接到DevS环境的JDBC url时,表BOOK就出现了,如DataSource.groovy所示:
jdbc:h2:mem:devDb;MVCC=TRUE
username: sa
password: <blank>
但是select返回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 build,即2.3.1
嵌入式H2数据库vrsion = H2 1.3.173(2013-07-28)
答案 0 :(得分: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)
答案 1 :(得分:0)
我建议改变
dbCreate =“create-drop”
到
dbCreate =“update”
在您的DataSource.groovy上再试一次
答案 2 :(得分:0)
当我按照Nick建议修改spring bean时,我无法启动run-app并同时启动grails控制台或shell。这是我得到的错误:
消息:创建名称为&#39; h2Server&#39;的init时出错:init方法的调用失败;嵌套异常是org.h2.jdbc.JdbcSQLException:异常打开端口&#34; 8043&#34; (端口可能正在使用中),原因:&#34; java.net.BindException:已在使用的地址&#34; [90061-173]
对网址的简单更改有效,感谢尼克 - :)