当我尝试使用eclipselink在DB2中实现并发事件时,我在实体类中添加了一个注释@Version:
@Version
@Column(name = "LAST_MNT_TS")
private Timestamp lastMaintenanceTimestamp;
之后我尝试更新表,似乎会调用系统表来搜索时间戳。但是,我没有DB2系统表的权限。例外是:
[EL Fine]: 2011-06-28 11:05:21.98--ClientSession(15607581)--Connection(11405376)--Thread(Thread[main,5,main])--SELECT DISTINCT CURRENT TIMESTAMP FROM SYSIBM.SYSTABLES
[EL Fine]: 2011-06-28 11:05:22.309--ClientSession(15607581)--Thread(Thread[main,5,main])--VALUES(1)
[EL Warning]: 2011-06-28 11:05:22.637--UnitOfWork(19624355)--Thread(Thread[main,5,main])--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.ibm.db2.jcc.a.SqlException: DB2 SQL error: SQLCODE: -551, SQLSTATE: 42501, SQLERRMC: DT82056;SELECT;SYSIBM.SYSTABLES
Error Code: -551
Call: SELECT DISTINCT CURRENT TIMESTAMP FROM SYSIBM.SYSTABLES
Query: ValueReadQuery(sql="SELECT DISTINCT CURRENT TIMESTAMP FROM SYSIBM.SYSTABLES")
[EL Config]: 2011-06-28 11:05:29.715--ServerSession(16239564)--Connection(11405376)--Thread(Thread[main,5,main])--disconnect
如何跳过系统表中的搜索?
答案 0 :(得分:0)
根据我在EclipseLink代码中看到的内容,您可能需要针对此问题打开错误。我不使用EclipseLink,但我花了一分钟时间下载源代码的最新版本,看看问题是否仍然存在。
org.eclipse.persistence.platform.database.DB2Platform的源代码显示getTimestampQuery()仍会返回您遇到的同样草率,浪费的查询。完全没有理由查询SYSIBM.SYSTABLES只是为了让DB2为您提供时间戳。如果您对此问题足够关注以打开错误,则可以建议他们使用"SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1"
虽然同一个类中的getNativeTableInfo()也引用了SYSIBM.SYSTABLES,但这些注释暗示该方法只是对普通JDBC驱动程序的兼容性对冲,假设该方法甚至被调用。