0

在我的应用程序日志中,我可以看到查询结果正在被迭代(使用 JDBC ResultSet,没什么特别的),并且实际上在表中的某些结果要么丢失,要么在结果集中出现得太晚(I'我不确定是哪个,因为如果发生这种情况,我经常会在结束之前遇到主键违规)。

我的查询是:

select t.* from myschema.vm t order by id;

但是,当我在 SQL Developer 中运行完全相同的查询时(数据库没有更改),我看不到这个问题发生,并且它只在我的应用程序中发生大约一半的时间(我怀疑它有时不会发生,因为由于所有插入和更新,表会发生变化)。

其他需要提及的关键点:

  1. 我正在使用另一个数据库连接进行更新、插入和可能删除,同时我正在迭代 ResultSet。不过,这应该没关系吧?
  2. 我正在使用 BoneCP 进行连接池。
  3. 数据库编码为 AL32UTF8。

为什么会这样?这让我疯狂!

4

2 回答 2

0

Oracle 结果集在您执行查询的那一刻被冻结,无论您多晚获取数据(或其中的一部分);因此,如果其他会话插入数据,您会发现(正确排序)只有在打开游标时已经提交的行。

另外,我怀疑您使用对表上找到的当前值的一些评估来创建您的 ID,而不是使用序列或共享原子计数器,因此您会遇到 PK 违规。

于 2013-10-22T12:36:39.253 回答
0

此问题是由于用户错误造成的。我在另一台机器上运行了另一个应用程序副本,但我忘记了它,同时也在更改数据库。

于 2013-10-31T09:28:23.033 回答