【发布时间】:2016-09-14 11:17:32
【问题描述】:
我们正在 WebSphere Liberty 上运行一个简单的 Web 应用程序,它使用 Hibernate 作为持久性提供程序(作为库包含在 WAR 文件中)。
当应用程序启动时,Hibernate 被初始化,它将打开一个到 DB2 的连接并发出一些 SQL 语句。但是,当在 CICS 上运行并使用 JDBC 类型 2 驱动程序数据源时,这会失败。记录了以下消息(一些额外的换行符以提高可读性):
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 请求时)。该问题仅与启动有关。
【问题讨论】:
-
@Gas 你能说得更具体点吗?我只是仔细检查了——我们的 DB2 DataSource 配置与给定文章中的完全相同(没有指定 properties.db2.jcc)。
-
但是 CICS 端配置了吗?在该页面上,您有配置CICS region 的链接。我不是 CICS 专家,因此无法帮助您。
-
@Gas 谢谢。 CICS 端已配置(不能说是否正确完成),但一般而言,一旦启动 webapp,DB2 访问就可以正常工作,只有在启动期间才会出现此问题。更新了帖子以澄清这一点。
标签: java db2 websphere-liberty cics db2-zos