Таблицы бросков Грааля "ххх" не найдены - PullRequest
2 голосов
/ 18 января 2012

В Grails я могу создать доменные объекты для H2 в источнике данных памяти в BootStrap и получить результаты обратно нормально, но как только приложение запущено (например, запрос от GSP или контроллера), и я пытаюсь запустить запрос я получаю это:

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)
  • Я очистил сборку

  • Бегущий Грааль 2.0.0

  • У меня было несколько источников данных для баз данных SQL-серверов, которые только обращаются к StoredProcedures и теперь нашли вариант использования H2 в хранилище памяти, используя старые добрые объекты Domain ... ошибка возникает только на
    домены.

  • Я запустил 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:

   new FunctionalDocType(typeName: 'Order',   direction: buyerToSeller, functionalGroup: orders).save().save(flush: true)

   //  insert into functional_doc_type (id, version, direction_id, functional_group_id, type_name) values (null, ?, ?, ?, ?)


   FunctionalDocType.findAll() runs:

    // DEBUG SQL - 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_

и возвращаются все правильные значения.

То есть, как будто вкладки в памяти удаляются после начальной загрузки, но это не регистрируется.

Любая помощь приветствуется.

Спасибо

Steve

Ответы [ 2 ]

5 голосов
/ 19 января 2012

H2 закрывает базу данных, когда закрывается последнее соединение.Для базы данных в памяти закрытие соединения означает, что данные потеряны ...

Так что, если вы все время оставляете одно соединение открытым, то все будет в порядке.Вы можете назвать это «дозорным» соединением.

Другой вариант - использовать постоянную базу данных (URL базы данных jdbc:h2:~/test/app_data;MVCC=TRUE)

2 голосов
/ 19 января 2012

большинство баз данных памяти связывают базу данных с используемым соединением. Hibernate открывает соединение для каждого сеанса, поэтому только сеанс с SchemaExport имеет базу данных с правильной схемой и удаляется немедленно. Чтобы решить эту проблему, вы должны использовать одно и то же соединение для всех сеансов, которые обращаются к базе данных памяти.

connection = session.getConnection();

sessionfactory.openSession(connection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...