2011-08-24 15 views
6

ライブとレポーティングデータベースに対してジャスパーレポートを実行しようとしていますが、ライブデータベースに対して実行されるレポートでは、(デフォルトのPUBLICスキーマが見つかりましたが)正しいテーブルを見つけられないという例外がスローされます。メインのDataSource接続が、IGNORECASE=trueを指定するH2接続設定を尊重していないように見えます。生成された列とテーブルが大文字になっているため、クエリでは表示されません。メモリ内のh2データソースに対してJasperレポートを実行していますか?

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(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')私はジャスパーは、アクティブメモリ内のH2データベースを操作するために行うには何が必要ですBasicDataSource

であるということですか?

このエラーは、実際のpostgresデータベースに対しては再現できません。

答えて

0

メモリ内のデータソースに対してレポートを実行しないでください。これは問題ではありません。

1

おそらく、別のデータベースを開いています。データベースURL jdbc:h2:mem:testDbを使用するとin-memory database within the same process and class loaderが開きます。

データベースURL jdbc:h2:~/testDbを使用して、通常の永続データベースを使用してみましたか?

異なるプロセスまたはクラスローダで実行されているインメモリデータベースを開くには、server modeを使用する必要があります。つまり、データベースが稼働しているstart a serverに接続し、jdbc:h2:tcp://localhost/mem:testDbを使用して接続してください。

database URL overviewも参照してください。

+0

'autoServer = TRUE'はまだ失敗し、手動でdatabsasesを開始することはオプションではありません。 'jdbc:h2:〜/ testDb'は、明示的にファイル参照を使用するのと同じように、ロックモードとクローズ遅延のすべての組み合わせで失敗します。 2番目のインメモリ・データベース*は動作し、接続はgrailsアプリケーション*と*ジャスパー・レポートの両方で実行できます。 –

+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ファイルを確認できます。トレースのために+1 –

+0

+1。明日は時間があれば試してみるよ。私の回避策は、スマートな配線で制御されているように、メモリ内のデータベースでレポートを実行しないことです –

関連する問題