Запускать Jasper Reports для источника данных h2 в памяти? - PullRequest
6 голосов
/ 24 августа 2011

Я пытаюсь запускать отчеты jasper для действующей базы данных и базы данных отчетов, но любые отчеты, запускаемые для действующей базы данных, выдают исключения о том, что не найдены нужные таблицы (хотя схема PUBLIC по умолчанию найдена).Похоже, что основное соединение DataSource не соответствует настройкам соединения H2, которые задают IGNORECASE=true, так как сгенерированные столбцы и таблицы пишутся с большой буквы, по моим запросам нет.

DataSource.groovy dataSource:

dataSource {
    hibernate {
        cache.use_second_level_cache = false
        cache.use_query_cache = false
    }

    dbCreate = "create-drop" // one of 'create', 'create-drop','update'
    pooled = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""
    url = "jdbc:h2:mem:testDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false"
    jndiName = null
    dialect = null 
}

Datasources.groovy dataSource:

datasource(name: 'reporting') {
    environments(['development', 'test'])
    domainClasses([SomeClass])
    readOnly(false)
    driverClassName('org.h2.Driver')
    url('jdbc:h2:mem:testReportingDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false')
    username('sa')
    password('')
    dbCreate('create-drop')
    logSql(false)
    dialect(null)
    pooled(true)
    hibernate {
        cache {
            use_second_level_cache(false)
            use_query_cache(false)
        }
    }
}

Что не удалось:

JasperPrint print = JasperFillManager.fillReport(compiledReport, params,dataSource.getConnection())

Во время отладкиЕдинственное различие, которое я обнаружил, состоит в том, что живой источник данных, когда вводится или ищется с DatasourcesUtils.getDataSource(null), это TransactionAwareDatasourceProxy, а DatasourcesUtils.getDataSource('reporting') это BasicDataSource

Что мне нужно сделать дляJasper для работы с активной базой данных H2 в памяти?

Этот сбой невозможно воспроизвести для реальной базы данных postgres.

Ответы [ 3 ]

1 голос
/ 26 августа 2011

H2 в настоящее время не поддерживает регистрозависимые идентификаторы (имена таблиц, имена столбцов).Я знаю, что другие базы данных поддерживают его, но в настоящее время H2 использует обычные java.util.HashMap<String, ..> для метаданных, и это зависит от регистра (независимо от того, используется IGNORECASE или нет).

В этом случае имена идентификаторов чувствительны к регистру.Я пытался использовать URL базы данных jdbc:h2:mem:testReportingDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false с помощью консоли H2:

DROP TABLE IF EXISTS UPPER;
DROP TABLE IF EXISTS lower;
CREATE TABLE UPPER(NAME VARCHAR(255));
CREATE TABLE lower(name VARCHAR(255));

-- ok:
SELECT * FROM UPPER;
SELECT * FROM lower;

-- fail (table not found):
SELECT * FROM upper;
SELECT * FROM LOWER;

Итак, вопрос в том, были ли они созданы при использовании идентификаторов в верхнем регистре или другого URL базы данных?Можно ли это изменить?Если нет: возможно ли использовать другой URL базы данных?

1 голос
/ 25 августа 2011

Возможно, вы открываете другую базу данных.Использование URL базы данных jdbc:h2:mem:testDb откроет базу данных в памяти в том же процесс и загрузчик классов .

Вы уже пробовалииспользуя обычную постоянную базу данных, используя URL базы данных jdbc:h2:~/testDb?

Чтобы использовать базу данных в памяти, которая выполняется в другом процессе или загрузчике классов, вам необходимо использовать режим сервера .Это означает, что вам нужно запустить сервер , на котором работает база данных, и подключиться к нему с помощью jdbc:h2:tcp://localhost/mem:testDb.

См. Также обзор URL базы данных .

0 голосов
/ 31 августа 2011

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

...