WebSphere7 XA 数据源配置问题

最近在部署Spring MVC 类型的应用程序到WebSphere7服务器+DB2 V9 的过程中,遇到了XA数据源报错如下:

com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.57.82] 操作无效:已关闭 result set。 ERRORCODE=-4470, SQLSTATE=null
	at com.ibm.db2.jcc.am.bd.a(bd.java:660)
	at com.ibm.db2.jcc.am.bd.a(bd.java:60)
	at com.ibm.db2.jcc.am.bd.a(bd.java:103)
	at com.ibm.db2.jcc.am.zl.Db(zl.java:4219)
	at com.ibm.db2.jcc.am.zl.c(zl.java:314)
	at com.ibm.db2.jcc.am.zl.next(zl.java:293)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.next(WSJdbcResultSet.java:3120)
经过查看代码,发现代码中没有出现resultset关闭后再引用的现象,同样的代码,部署在tomcat+DB2环境就是好的,代码应该是没有问题的。

于是开始了在度娘上进行搜索,发现竟然几乎搜不到相关案例可以参考,只是有一篇文章提示将 数据源 中的定制属性 resultSetHoldability 的值改为2。可是我看了我配置的 resultSetHoldability 属性值的确为2,但是一点用都没有。

针对 resultSetHoldability  取值有两个:ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。我对比了一下我的 WebSphere ,结合错误提示,觉得我的 resultSetHoldability 值应该设置为1才对。


好,那么我们把这个值的属性设置为1,再重新启动系统,等待结果。等了半天,结果却是这样的:

com.ibm.db2.jcc.am.SqlException: [jcc][t4][10434][12579][3.57.82] 操作无效:不允许在 XA 连接上使用 ResultSet 可持有性 HOLD_CURSORS_OVER_COMMIT。 ERRORCODE=-4476, SQLSTATE=null
	at com.ibm.db2.jcc.am.bd.a(bd.java:660)
	at com.ibm.db2.jcc.am.bd.a(bd.java:60)
	at com.ibm.db2.jcc.am.bd.a(bd.java:120)
	at com.ibm.db2.jcc.am.jb.c(jb.java:1735)
	at com.ibm.db2.jcc.am.jb.a(jb.java:2116)
	at com.ibm.db2.jcc.am.jb.a(jb.java:2097)
	at com.ibm.db2.jcc.am.jb.prepareStatement(jb.java:1654)
	at com.ibm.db2.jcc.am.ve.prepareStatement(ve.java:243)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.pmiPrepareStatement(WSJdbcConnection.java:2503)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2746)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcConnection.prepareStatement(WSJdbcConnection.java:2696)
......
或是这样的:

com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10341][11670] An SQL OPEN for a held cursor was issued on a XA connection
	at com.ibm.db2.jcc.c.fg.x(fg.java:1961)
	at com.ibm.db2.jcc.c.gg.d(gg.java:2447)
	at com.ibm.db2.jcc.c.gg.V(gg.java:424)
	at com.ibm.db2.jcc.c.gg.executeQuery(gg.java:407)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.pmiExecuteQuery(WSJdbcPreparedStatement.java:1102)
	at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:723)
......

这下傻了眼了,还是不行,于是继续度娘,但是这次什么信息都找不到了。

内事问度娘,外事问谷歌,于是我又投入了谷歌的怀抱。

在谷歌上搜寻了许久,发现类似的问题很多,经过一天的筛选,终于找到了我想要的东西。下面是在IBM的官网上发现的:

http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.doc/ae/tejb_jpatroubleshoot.html?lang=zh

对关闭游标问题进行故障诊断。
以下是日志 org.apache.openjpa.persistence.PersistenceException 中的 DB2® 异常:
[ibm][db2][jcc][10120][10898] Invalid operation: result set is closed can be a WebSphere Application Server configuration problem.
缺省情况下,应用程序服务器将 resultSetHoldability 定制属性值配置为 2 (CLOSE_CURSORS_AT_COMMIT)。此属性将导致 DB2 在事务边界关闭其结果集/游标。尽管 DB2 的缺省 resultSetHoldability 值为 1 (HOLD_CURSORS_OVER_COMMIT),但应用程序服务器将缺省值保留为 2 以避免中断与前发行版应用程序服务器的兼容性。可更改缺省值。
Attention: 如果此数据源是 XA 数据源,请对此数据源定义新定制属性,其中 property_name = downgradeHoldCursorsUnderXa,boolean value = true。
避免故障 避免故障: 在 V8.0 中,如果使用 DB2 XA 数据源,那么需要进行下列配置以解决结果集已关闭问题:
使用 DB2 V9.1 FP4(对于 APAR IZ18072)或更高版本。
添加定制属性 name="downgradeHoldCursorsUnderXa"、value="true" 和 type="java.lang.Boolean"
添加定制属性 name="resultSetHoldability"、value="1" 和 type="java.lang.Integer"


原来,要是用 XA事务数据源,还需要再配置一个 downgradeHoldCursorsUnderXa 的定制属性。

果不其然,在数据源中增加了这个属性后,一切都OK了



你可能感兴趣的:(WebSphere)