Hibernate を持続性プロバイダーとして使用する WebSphere Liberty で単純な webapp を実行しています (WAR ファイルにライブラリーとして含まれています)。
アプリケーションが起動すると、Hibernate が初期化され、DB2 への接続が開かれ、いくつかの SQL ステートメントが発行されます。ただし、CICS で実行し、JDBC Type 2 Driver DataSource を使用すると、これは失敗します。次のメッセージがログに記録されます (読みやすいように改行が追加されています)。
WARN org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator -
HHH000342: Could not obtain connection to query metadata : [jcc][50053][12310][4.19.56]
T2zOS exception: [jcc][T2zos]T2zosCicsApi.checkApiStatus:
Thread is not CICS-DB2 compatible: CICS_REGION_BUT_API_DISALLOWED ERRORCODE=-4228, SQLSTATE=null
...
ERROR org.hibernate.hql.spi.id.IdTableHelper - Unable obtain JDBC Connection
com.ibm.db2.jcc.am.SqlException: [jcc][50053][12310][4.19.56] T2zOS exception: [jcc][T2zos]T2zosCicsApi.checkApiStatus:
Thread is not CICS-DB2 compatible: CICS_REGION_BUT_API_DISALLOWED ERRORCODE=-4228, SQLSTATE=null
at com.ibm.db2.jcc.am.kd.a(Unknown Source) ~[db2jcc4.jar:?]
...
at com.ibm.db2.jcc.t2zos.T2zosConnection.a(Unknown Source) ~[db2jcc4.jar:?]
...
at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(Unknown Source) ~[db2jcc4.jar:?]
at com.ibm.cics.wlp.jdbc.internal.CICSDataSource.getConnection(CICSDataSource.java:176) ~[?:?]
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[our-app.war:5.1.0.Final]
at org.hibernate.internal.SessionFactoryImpl$3.obtainConnection(SessionFactoryImpl.java:643) ~[our-app.war:5.1.0.Final]
at org.hibernate.hql.spi.id.IdTableHelper.executeIdTableCreationStatements(IdTableHelper.java:67) [our-app.war:5.1.0.Final]
at org.hibernate.hql.spi.id.global.GlobalTemporaryTableBulkIdStrategy.finishPreparation(GlobalTemporaryTableBulkIdStrategy.java:125) [our-app.war:5.1.0.Final]
at org.hibernate.hql.spi.id.global.GlobalTemporaryTableBulkIdStrategy.finishPreparation(GlobalTemporaryTableBulkIdStrategy.java:42) [our-app.war:5.1.0.Final]
at org.hibernate.hql.spi.id.AbstractMultiTableBulkIdStrategyImpl.prepare(AbstractMultiTableBulkIdStrategyImpl.java:88) [our-app.war:5.1.0.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:451) [our-app.war:5.1.0.Final]
私の現在の理解では、CICS で実行し、JDBC Type 2 ドライバーを使用する場合、一部のスレッドのみが DB2 接続を開くことができます。それは、アプリケーション スレッド (HTTP 要求を処理するスレッド) と、サービスを提供するワーカー スレッドCICSExecutorService
です。
現在の解決策は次のとおりです。
- プロパティを に
JdbcEnvironmentInitiator
設定して、JDBC メタデータ ルックアップを無効にします。hibernate.temp.use_jdbc_metadata_defaults
false
- の実行を にラップ
IdTableHelper#executeIdTableCreationStatements
し、Runnable
に送信しCICSExecutorService
ます。
このソリューションは、本番環境に十分かつ適していると思いますか? それとも、別のアプローチを使用していますか?
使用したバージョン:
- z/OS 5.3.0 用の CICS トランザクション サーバー
- WebSphere アプリケーション サーバー 8.5.5.8
- 休止状態 5.1.0
更新:明確にするために、アプリケーションが開始されると、問題なく DB2 を照会できます (HTTP 要求を処理する場合)。問題は起動にのみ関連しています。