2012-01-18 72 views
2

在Grails中,我可以在内存数据源中创建一个域对象到H2,在BootStrap中获得结果,但是一旦应用程序启动(例如,来自GSP或控制器的查询)尝试运行一个查询,我得到这样的:Grails抛出表“xxx”找不到

org.h2.jdbc.JdbcSQLException: Table "FUNCTIONAL_DOC_TYPE" not found; SQL statement: 
select this_.id as id1_0_, this_.version as version1_0_, this_.direction_id as direction3_1_0_, this_.functional_group_id as functional4_1_0_, this_.type_name as type5_1_0_ from functional_doc_type this_ [42102-147] 
at org.h2.message.DbException.getJdbcSQLException(DbException.java:327) 
at org.h2.message.DbException.get(DbException.java:167) 
at org.h2.message.DbException.get(DbException.java:144) 
at org.h2.command.Parser.readTableOrView(Parser.java:4562) 
at org.h2.command.Parser.readTableFilter(Parser.java:1020) 
at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1622) 
at org.h2.command.Parser.parseSelectSimple(Parser.java:1729) 
at org.h2.command.Parser.parseSelectSub(Parser.java:1616) 
at org.h2.command.Parser.parseSelectUnion(Parser.java:1461) 
at org.h2.command.Parser.parseSelect(Parser.java:1449) 
at org.h2.command.Parser.parsePrepared(Parser.java:401) 
at org.h2.command.Parser.parse(Parser.java:275) 
at org.h2.command.Parser.parse(Parser.java:247) 
at org.h2.command.Parser.prepare(Parser.java:201) 
at org.h2.command.Parser.prepareCommand(Parser.java:214) 
at org.h2.engine.Session.prepareLocal(Session.java:425) 
at org.h2.engine.Session.prepareCommand(Session.java:374) 
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1056) 
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:71) 
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:233) 
at org.apache.commons.dbcp.DelegatingConnection.prepareStatement(DelegatingConnection.java:281) 
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.prepareStatement(PoolingDataSource.java:313) 
at org.grails.datastore.gorm.GormStaticApi.findAll(GormStaticApi.groovy:374) 
  • 我已经打扫构建

  • 运行的Grails 2.0.0

  • 我有多个数据源到SQL服务器数据库的,只有做呼叫 StoredProcedures和现在已经找到了一个用例使用好老域对象...错误只发生在
    域使用存储在内存中一个H2。

  • 我跑了DBCONSOLE,发现仅有的表就是标准的28
    “内部” 表...没有一个是从我的应用程序

一些来源:

DataSource.groovy的

// "Parent" datasource def 

dataSource_messages { 
    pooled = true 
    driverClassName = "net.sourceforge.jtds.jdbc.Driver" 
    username = "user" 
    password = "secret" 
    readOnly = "true" 
} 


// environment specific settings 
environments { 
    development { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:h2:mem:app_data;MVCC=TRUE" 
      pooled = true 
      driverClassName = "org.h2.Driver" 
      username = "sa" 
      password = "" 
      readOnly = false 
     } 
     dataSource_messages { 
      url = "jdbc:jtds:sqlserver://localhost:1433;DatabaseName=Messages" 
     } 

域类:

class FunctionalDocType { 
    String typeName 
    FunctionalGroup functionalGroup 
    DocDirection direction 

    static constraints = { 
     functionalGroup(nullable: true) 
    } 

} 

BootStrap.groovy中:返回

​​

和正确的价值观。

因此,它像在内存脊髓痨被引导地方后下降,但这种不被记录。

任何帮助表示赞赏。

感谢,

史蒂夫

+1

是否行得通? – 2012-01-18 10:57:30

+0

+1给你托马斯,谢谢你的回答;这似乎工作。我还不确定为什么它不能以第一种方式工作,我还没有听说过Grails小组,但我认为持久数据存储对我的用例应该没问题。再次感谢你。 – Steve 2012-01-18 21:47:34

回答

5

H2在上次连接关闭时关闭数据库。对于内存数据库,关闭连接意味着数据丢失......

所以,如果你把一个连接打开所有的时间,那么你应该罚款。你可以称之为'哨兵'连接。

另一种选择是,如果你使用一个持久数据库(数据库URL`JDBC:H2:〜/测试/ app_data文件; MVCC = TRUE;)使用的持久数据库(数据库URL jdbc:h2:~/test/app_data;MVCC=TRUE

2

最内存数据库配合数据库使用的连接。 Hibernate为每个会话打开一个连接,所以只有与SchemaExport的会话具有正确模式的数据库并立即处理。要解决这个问题,您必须对访问内存数据库的所有会话使用相同的连接。

connection = session.getConnection(); 

sessionfactory.openSession(connection); 
+0

感谢Firo,吸取了教训。我做了这样的假设,因为默认情况下Grails开发模式使用内存,所以没有问题,所以有一些信念不会发生。所以我猜如果我没有在Bootstrap上运行数据库操作,那么我不会看到这个问题。无论如何,感谢你和托马斯,我有两个很好的选择去探索和学习更多关于记忆DB的知识。干杯! – Steve 2012-01-19 22:16:21

相关问题