2011-08-24 65 views
6

我试图针对实时数据库和报告数据库运行jasper报告,但是任何针对实时数据库运行的报告都会抛出有关未找到正确表的异常(尽管可以找到默认的PUBLIC模式)。它看起来好像主要DataSource连接不遵守指定IGNORECASE=true的H2连接设置,因为生成的列和表都是大写的,我的查询不是。针对内存中的h2数据源运行Jasper报告?

DataSource.groovy的数据源:

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(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

什么,我需要做的贾斯帕主动内存H2数据库进行操作?

这个失败是不可重现的真正的postgres数据库。

回答

0

只是不要运行内存数据源的报告,这不会是一个问题。

1

也许你正在打开一个不同的数据库。使用数据库URL jdbc:h2:mem:testDb将打开一个in-memory database within the same process and class loader

您是否尝试使用常规持久数据库,使用数据库网址jdbc:h2:~/testDb

要使用打开在不同进程或类加载器中运行的内存数据库,您需要使用server mode。这意味着,您需要start a server数据库正在运行,并使用jdbc:h2:tcp://localhost/mem:testDb连接到它。请参阅database URL overview

+0

'autoServer = TRUE'仍然失败,并且手动启动数据库不是一个选项。 'jdbc:h2:〜/ testDb'会失败,就像显式使用一个文件引用一样,所有的锁定模式和紧密延迟的组合都会失败。第二个内存数据库*工作*,连接可以由运行的grails应用程序*和* jasper报告使用。 –

+0

你使用什么版本的H2? “失败”是指表格不可用?如果您遇到异常,您可以发布它吗? –

+0

我更新了我的问题。问题似乎是表格和列在H2中被大写,这应该罚款'IGNORECASE = true',但是当我传递连接时,使用小写表/列名称的查询失败,只有一个数据源。 我正在使用H2 1.3.159。 –

1

H2当前不支持不区分大小写的标识符(表名,列名)。我知道其他数据库支持它,但目前H2使用常规的java.util.HashMap<String, ..>作为元数据,并且区分大小写(不论是否使用IGNORECASE)。

在这种情况下,标识符名称区分大小写。我试图使用H2控制台数据库的URL jdbc:h2:mem:testReportingDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false

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?

+0

问题是这两个表都是由GORM自动创建的,所以我不明白为什么这些上限会随机变化。 –

+0

您可以通过将TRACE_LEVEL_FILE = 2添加到数据库URL来验证执行了哪些语句,然后检查.trace.db文件。 –

+0

+1。如果我有时间,我会明天尝试一下。现在,我的解决方法是不使用内存数据库运行报告,并使用一些智能布线进行控制 –