首页 > 解决方案 > 解决 EclipseLink @Version Timestamp-Field 和 DB2 之间冲突的最佳方法

问题描述

在我正在处理的当前项目中,我们使用EclipseLink 作为 JPA-Provider。在后台是一个DB2 数据库
我们想引入“乐观锁定”使用Timestamp-fields进行限制。此外,这些时间戳字段是 CURRENT TIMESTAMP 字段,因此在更新实体时,CURRENT TIMESTAMP 字段会更新值本身。这是保证整个系统的可靠性所必需的。

使用 @Version 注释实体的属性时,我收到以下错误消息:

内部异常:com.ibm.websphere.ce.cm.StaleConnectionException:不支持 SQL 语句。SQLCODE=-142,SQLSTATE=42612,DRIVER=4.22.29
错误代码:-142
调用:VALUES CURRENT TIMESTAMP
查询:在
org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1 上的 ValueReadQuery(sql="VALUES CURRENT TIMESTAMP")。
org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)处的 handleException(EntityManagerSetupImpl.java:767 ) […]


注意:我只在使用提到的注释时收到此错误消息。

我的研究结果如下:

  1. 内部异常:com.ibm.websphere.ce.cm.StaleConnectionException:--> StaleConnectionException 是当 JDBC 驱动程序从连接请求或操作返回致命错误时由 WebSphere Application Server 数据库连接代码生成的异常。在 WebSphere Application Server 中,当数据库供应商发出异常指示当前位于连接池中的连接不再有效时,就会发出 StaleConnectionException。(https://developer.ibm.com/answers/questions/205910/how-to-resolve-the-staleconnectionexception-in-web/
  2. 不支持 SQL 语句。SQLCODE=-142, --> 检测到数据库不支持的 SQL 语句。该语句可能对其他 IBM® 关系数据库产品有效,也可能在其他上下文中有效。例如,诸如 VALUES和 SIGNAL 或 RESIGNAL SQLSTATE 之类的语句只能在某些上下文中使用,例如在触发器主体或 SQL 过程中。(https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/n142.html
  3. SQLSTATE=42612,
    --> 似乎是内部的,与我无关

在深入了解该主题后,我发现了以下链接,这是迄今为止最令人鼓舞的链接:
https
://www.idug.org/p/fo/et/thread=36380 总之,建议的方法是扩展 org.eclipse.persistence.platform.database.DB2MainframePlatform 并操作生成的 SQL 语句。

我的期望是,应该有更好的方法,因为这应该是框架的标准案例。如果没有,是否有更合适/更好的方法来解决这个问题?

标签: javadb2eclipselink

解决方案


推荐阅读