2012-01-18 76 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

相關問題