使用 grails 控制台创建的新域对象在 dbconsole 中不可见
Posted
技术标签:
【中文标题】使用 grails 控制台创建的新域对象在 dbconsole 中不可见【英文标题】:new domain object created with grails console not visible in dbconsole 【发布时间】:2013-10-23 13:06:06 【问题描述】:我正在尝试在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 中不可见 当我使用 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)
【问题讨论】:
发现 this 建议将保存包装在事务中? @tim_yates 在您提到的问题中,问题似乎是在不使用事务包装的情况下无法在外壳/控制台中创建对象。我的问题不同,因为该对象在 shell 中创建得很好,并且 list() 返回该类型的新创建对象,但该对象在 H2 dbconsole 中不可见。无论如何,我尝试了交易包装,但结果是一样的。 【参考方案1】:我认为问题在于数据库被锁定。让我们试试这个(在我的实验中有效):
编辑您的 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)
【讨论】:
嗨尼克,我在阅读令人惊讶的清晰 h2 文档时得出了完全相同的结论;但还没有来这里写下来。因此,感谢您的清晰解释,这肯定会帮助更多偶然发现这个问题的用户。有一个赞成和接受的答案;当之无愧 好答案。为了清楚起见,根据文档:AUTO_SERVER=TRUE 功能不适用于内存数据库。【参考方案2】:我建议换个
dbCreate = "创建-删除"
到
dbCreate = "更新"
在您的 DataSource.groovy 上再试一次
【讨论】:
【参考方案3】:当我按照 Nick 的建议修改 spring bean 时,我无法启动 run-app 并同时启动 grails 控制台或 shell。这是我得到的错误:
消息:创建名为“h2Server”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.h2.jdbc.JdbcSQLException: 异常打开端口“8043”(端口可能正在使用),原因:“java.net.BindException:地址已在使用”[90061-173]
对 url 的简单更改有效,感谢 Nick -:)
【讨论】:
这不是问题的答案。以上是关于使用 grails 控制台创建的新域对象在 dbconsole 中不可见的主要内容,如果未能解决你的问题,请参考以下文章