尝试将数据源配置为使用不可共享的连接。
如果您遵循此示例,您将看到它使用较旧的部署描述符 XML 文件。您可以编辑 batch-bonuspayout-application/src/main/webapp/WEB-INF/web.xml以添加以下行:
<res-sharing-scope>Unshareable</res-sharing-scope>
因此,您将拥有:
<web-app id="BonusPayout" version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<display-name>BonusPayout</display-name>
<description>This is the BonusPayout sample.</description>
<resource-ref>
<description>Bonus Payout DS</description>
<res-ref-name>jdbc/BonusPayoutDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Unshareable</res-sharing-scope>
</resource-ref>
</web-app>
这也可以使用较新的@Resource注释来完成,但是如果您已经切换到该注释,那么您也将知道如何在此处应用这一点。
通过此更改,位于以下位置的现有 JNDI 查找: java:comp/env/jdbc/BonusPayoutDS现在将使用非共享连接,并且 ResultSet 不会在每个块事务结束时关闭。
此行为间接记录在WebSphere Application Server 传统文档中。(我在 Liberty 文档中没有看到它,在某些情况下,Liberty 中的行为基本相同,并且 Liberty 中没有单独记录该主题。)对于批处理用户来说有点间接。也很难完全描述,因为文档说确切的行为因 DB 和 JDBC 提供程序而异。但这应该适用于 DB2。
更新: 在 Liberty 的较新版本(自 17.0.0.1 起)中,可以通过使用enableSharingForDirectLookups属性配置 connectionManager 来获得不可共享的连接,而无需使用资源引用,例如:
<connectionManager ... enableSharingForDirectLookups="false"/>