2011-08-24 18 views
6

Estoy tratando de ejecutar informes de jaspe contra una base de datos en vivo y de informes, pero los informes ejecutados contra la base de datos en vivo arrojan excepciones sobre no encontrar las tablas correctas (aunque se encuentra el esquema público predeterminado). Parece que la conexión principal DataSource no respeta las configuraciones de conexión H2 que especifican IGNORECASE=true, ya que las columnas y tablas generadas están en mayúscula, por lo que mis consultas no lo hacen.¿Está ejecutando los informes de Jasper en un origen de datos h2 en 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) 
     } 
    } 
} 

lo que falla:

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

Durante la depuración, la única diferencia que' ve encontrado es que el origen de datos en vivo, cuando se inyecta o se mire con DatasourcesUtils.getDataSource(null), es un TransactionAwareDatasourceProxy, y es un DatasourcesUtils.getDataSource('reporting')BasicDataSource

¿Qué necesito hacer para Jasper para operar en la base de datos de H2 en memoria activa?

Este error no es reproducible en una base de datos real de postgres.

Respuesta

0

Simplemente no ejecute informes contra fuentes de datos en memoria, y esto no será un problema.

1

Probablemente estás abriendo una base de datos diferente. Con la URL de la base de datos jdbc:h2:mem:testDb se abrirá un in-memory database within the same process and class loader.

¿Ha intentado ya utilizar una base de datos persistente regular, utilizando la base de datos URL jdbc:h2:~/testDb?

Para utilizar abre una base de datos en memoria que se ejecuta en un proceso diferente o cargador de clases, debe utilizar el server mode. Esto significa que necesita start a server donde se está ejecutando la base de datos, y conectarse a ella usando jdbc:h2:tcp://localhost/mem:testDb.

Vea también database URL overview.

+0

'autoServer = TRUE' aún falla, y el inicio manual de databsases no es una opción. 'jdbc: h2: ~/testDb' falla, al igual que el uso de una referencia de archivo explícitamente, con todas las combinaciones de modos de bloqueo y demoras de cierre. La segunda base de datos en memoria * funciona *, y la conexión puede ser utilizada tanto por la aplicación running grails * como por * jasper reports. –

+0

¿Qué versión de H2 usas? ¿Con 'fallas' te refieres a que las tablas no están disponibles? Si obtiene una excepción, ¿podría publicarla? –

+0

He actualizado mi pregunta. El problema parece ser que las tablas y columnas se escriben en mayúsculas dentro de H2, lo cual debería estar bien dado 'IGNORECASE = true', pero cuando paso la conexión, las consultas con nombres de tabla/columna en minúsculas fallan, solo con el origen de datos. Estoy usando H2 1.3.159. –

1

H2 no es compatible actualmente con identificadores que no distinguen mayúsculas de minúsculas (nombres de tabla, nombres de columna). Sé que otras bases de datos lo admiten, pero actualmente H2 usa los java.util.HashMap<String, ..> regulares para los metadatos, y eso distingue entre mayúsculas y minúsculas (se use o no IGNORECASE).

En este caso, los nombres de los identificadores distinguen entre mayúsculas y minúsculas. Probé con la URL de la base de datos jdbc:h2:mem:testReportingDb;MODE=PostgreSQL;IGNORECASE=TRUE;DATABASE_TO_UPPER=false utilizando la Consola de 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; 

Entonces, la pregunta es: cuando se crean las tablas, fueron creados con identificadores en mayúsculas o una URL base de datos diferente? ¿Es posible cambiar eso? Si no, ¿es posible usar una URL de base de datos diferente?

+0

El problema es que GORM crea las tablas automáticamente en ambos casos, por lo que no veo por qué los límites variarían aleatoriamente. –

+0

Puede verificar qué enunciados se ejecutan al agregar; TRACE_LEVEL_FILE = 2 a la URL de la base de datos y luego verificar el archivo .trace.db. –

+0

+1 para rastreo. Lo intentaré mañana si tengo tiempo. Mi solución por el momento es no ejecutar informes con bases de datos en memoria, ya que se controlan con algunos cables inteligentes. –

Cuestiones relacionadas