2013-02-16 33 views
2

我運行兩個INSERT SQL調用一個接一個地是Statement.RETURN_GENERATED_KEYS每個刀片具有它分配給它自己唯一的ID後,當線程安全的。 ( - 這是無論哪種方式,同樣的問題連接池或嵌入式數據庫)德比 - 獲取RETURN_GENERATED_KEYS似乎沒有使用相同的連接創建的PreparedStatement

每次調用與各種Connection.prepareStatement其中連接可以重新使用不同的線程中產生。

所以,當我做:

result = preparedStatement.getGeneratedKeys(); 
result.next(); 
return result.getInt(1); 

這回來不會出現線程安全的數字!它通常從第一個線程中抓取生成的ID。

基本上,如果我運行多個線程,嵌件做工精細,但隨後試圖讓自動生成的唯一的ID它帶回相同的ID。同樣,我懷疑這是因爲連接是共享的,我該怎麼辦

connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS); 

我看到有許多的替代參數,但我不熟悉他們。我怎樣才能保證每個preparedStatement稍後會返回它自己的唯一自動生成的ID?

UPDATE:這似乎只與嵌入式Derby數據庫驅動程序發生...

回答

2

爲了避免這種情況,你必須從關閉的PreparedStatement:

connection.prepareStatement(sqlString, Statement.RETURN_GENERATED_KEYS); 

你創建另一個preparedStatement。看起來在嵌入式Derby驅動程序中可能會有一個假設,即調用數據庫的代碼(至少對於INSERTS)將永遠不會被線程化。如果你要線程化,那麼請使用嵌入式驅動程序NOT

1

你可以使用自己的Java同步塊周圍的三行代碼,如:

synchronized(preparedStatement) 
{ 
    result = preparedStatement.getGeneratedKeys(); 
    result.next(); 
    return result.getInt(1); 
} 
相關問題