2013-10-22 51 views
0

在我的應用程序日誌中,我可以看到正在迭代查詢結果(使用JDBC ResultSet,沒有什麼奇怪的)和某些實際結果在表中,可能會丟失,或者在結果集中出現得太晚(我不確定是哪一個,因爲如果發生這種情況,我在結束之前經常會遇到主鍵衝突)。Oracle「order by」子句返回結果的順序錯誤或者結果丟失

我的查詢是:

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

然而我看不出這個問題發生時,我在運行SQL開發人員完全相同的查詢(數據庫的同時不改變),並且只出現約在我的應用程序中有一半的時間(我懷疑它有時不會發生,因爲所有插入和更新都會導致表更改)。

其他關鍵點提:

  1. 我做更新,插入和刪除操作可能使用其他數據庫連接,而我遍歷結果集。但是,這應該不重要,對嗎?
  2. 我正在使用BoneCP進行連接池。
  3. 數據庫編碼是AL32UTF8。

這是怎麼發生的?這讓我瘋狂!

+2

「id」列的數據類型是什麼? –

+0

@a_horse_with_no_name varchar2(64) –

+0

你是否指定了'resultSetType'或'resultSetConcurrency'的任何內容? –

回答

0

此問題是由於用戶錯誤。我在不同的機器上運行了應用程序的另一個副本,我忘記了這一點,這就是在同一時間更改數據庫。

0

無論您稍後獲取數據(或其中的一部分),Oracle結果集都會在執行查詢時凍結;所以,如果其他會話插入數據,您將會發現(正確排序)只有在您打開遊標時已經提交的行。

此外,我懷疑你創建你的ID與表上發現的當前值的一些評價,而不是使用序列或共享原子計數器,所以你得到違反PK。

+0

不,我不創建ID,這些不是生成的密鑰,它們是現實中已存在的主機名。 –

+0

這並不能解釋問題:這些是在迭代之前,之後和期間連續存在的結果。 –

+0

您寫過「我正在更新,插入並可能使用其他數據庫連接刪除,而我遍歷ResultSet」。 問題是:當你打開光標時,你確定「失蹤」的結果是否真的存在?你如何斷言他們應該在那裏? – dbra