【发布时间】:2013-10-31 05:20:39
【问题描述】:
在我的应用程序日志中,我可以看到查询结果正在被迭代(使用 JDBC ResultSet,没什么特别的),并且实际在表中的某些结果要么丢失,要么在结果集中出现得太晚(我不确定是哪个,因为如果发生这种情况,我经常会在结束之前遇到主键违规)。
我的查询是:
select t.* from myschema.vm t order by id;
但是当我在 SQL Developer 中运行完全相同的查询时,我看不到这个问题发生(当数据库没有改变时),它只在我的应用程序中出现大约一半的时间(我怀疑由于所有插入和更新导致表发生变化,因此有时不会发生这种情况。
其他要提的关键点:
- 我正在使用另一个数据库连接进行更新、插入和可能删除,同时我正在迭代 ResultSet。不过,这应该没关系吧?
- 我正在使用 BoneCP 进行连接池。
- 数据库编码为 AL32UTF8。
为什么会这样?快把我逼疯了!
【问题讨论】:
-
id列的数据类型是什么? -
@a_horse_with_no_name varchar2(64)
-
您是否为
resultSetType或resultSetConcurrency指定了任何内容? -
@Colin'tHart 是的,现在是
ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_READ_ONLY。在我之前与此问题相关的 StackOverflow 问题中,它有所不同,但它现在正在使用这些。 -
我怀疑您实际上是在该字符列中存储数字,现在您对
'10'出现在'2'之前感到惊讶。这是因为您以错误的方式存储数字。您应该将它们存储在NUMBER列中,然后排序将正确。