2011-08-24 9 views
6

Sto tentando di eseguire report jasper su un database live e di report, ma tutti i report eseguiti sul database live generano eccezioni per non trovare le tabelle giuste (sebbene sia stato trovato lo schema PUBLIC predefinito). Sembra che la connessione principale DataSource non stia rispettando le impostazioni di connessione H2 che specificano IGNORECASE=true, poiché le colonne e le tabelle generate sono in maiuscolo, perché le mie query non lo sono.Esecuzione di rapporti Jasper contro un'origine dati h2 in memoria?

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) 
     } 
    } 
} 

Cosa fallisce:

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

Durante il debug, l'unica differenza che ho' ho trovato è che l'origine dati dal vivo, quando iniettato o guardato con DatasourcesUtils.getDataSource(null), è un TransactionAwareDatasourceProxy, e DatasourcesUtils.getDataSource('reporting') è un BasicDataSource

Che cosa devo fare per Jasper di operare sul database attivo in memoria H2?

Questo errore non è riproducibile con un vero database postgres.

risposta

0

Semplicemente non eseguire report contro origini dati in memoria, e questo non sarà un problema.

1

Probabilmente si sta aprendo un database diverso. L'utilizzo dell'URL del database jdbc:h2:mem:testDb aprirà uno in-memory database within the same process and class loader.

Hai provato a utilizzare un normale database permanente, utilizzando l'URL del database jdbc:h2:~/testDb?

Per utilizzare un database in memoria in esecuzione in un caricatore di processi o classi diverso, è necessario utilizzare server mode. Ciò significa che è necessario start a server dove il database è in esecuzione e connettersi ad esso utilizzando jdbc:h2:tcp://localhost/mem:testDb.

Vedere anche lo database URL overview.

+0

'autoServer = TRUE' non riesce ancora e l'avvio manuale dei database non è un'opzione. 'jdbc: h2: ~/testDb' fallisce, così come usare esplicitamente un riferimento al file, con tutte le combinazioni di modalità di blocco e ritardi di chiusura. Il secondo database in memoria * funziona * e la connessione può essere utilizzata sia dai report in esecuzione grails * che in * jasper. –

+0

Quale versione di H2 usi? Con "fallisce" intendi che le tabelle non sono disponibili? Se ricevi un'eccezione, potresti postarla? –

+0

Ho aggiornato la mia domanda. Il problema sembra essere che le tabelle e le colonne vengono capitalizzate in H2, il che dovrebbe essere corretto dato 'IGNORECASE = true', ma quando passo la connessione, le query con nomi di tabelle/colonne in minuscolo falliscono, solo con l'origine dati. Sto usando H2 1.3.159. –

1

H2 al momento non supporta identificatori maiuscole/minuscole (nomi di tabelle, nomi di colonne). So che altri database lo supportano, ma attualmente H2 usa regolarmente lo java.util.HashMap<String, ..> per i metadati, e questo è sensibile al maiuscolo/minuscolo (se viene usato o meno IGNORECASE).

In questo caso, i nomi degli identificatori fanno distinzione tra maiuscole e minuscole. Ho provato con l'URL del database jdbc:h2:mem:testReportingDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false utilizzando la console di 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; 

Quindi, la domanda è: quando si creano le tabelle, sono stati hanno creato con identificatori maiuscole o un URL database diverso? È possibile cambiarlo? In caso contrario: è possibile utilizzare un URL di database diverso?

+0

Il problema è che le tabelle vengono create automaticamente da GORM in entrambi i casi, quindi non vedo perché le maiuscole potrebbero variare casualmente. –

+0

È possibile verificare quali istruzioni vengono eseguite aggiungendo; TRACE_LEVEL_FILE = 2 all'URL del database e quindi controllare il file .trace.db. –

+0

+1 per traccia. Ci proverò domani se avrò tempo. La mia soluzione per ora è di non eseguire rapporti con database in memoria, come controllato con alcuni collegamenti intelligenti –