我executeBatch()與JDBC一起使用以插入多行,并且我想為另一個插入獲取插入行的ID,為此我使用以下代碼:insertInternalStatement = dbConncetion.prepareStatement(INSERT_RECORD, generatedColumns);for (Foo foo: foosHashSet) { insertInternalStatement.setInt(1, foo.getMe()); insertInternalStatement.setInt(1, foo.getMe2()); // .. insertInternalStatement.addBatch();}insertInternalStatement.executeBatch();// now get inserted idstry (ResultSet generatedKeys = insertInternalStatement.getGeneratedKeys()) { Iterator<Foo> fooIterator= foosHashSet.iterator(); while (generatedKeys.next() && fooIterator.hasNext()) { fooIterator.next().setId(generatedKeys.getLong(1)); } }它工作正常并且返回id,我的問題是:如果我進行迭代,getGeneratedKeys()并且foosHashSetID將以相同的順序返回,以便從數(shù)據(jù)庫返回的每個ID都屬于對應(yīng)的Foo實例?當(dāng)我使用多線程時,上面的代碼同時在多個線程中運行怎么辦?還有其他解決方案嗎?我有兩個表foo1和foo2,我想先插入foo1記錄,然后將其主ID用作foo2外鍵。
3 回答

慕田峪7331174
TA貢獻1828條經(jīng)驗 獲得超13個贊
如果getGeneratedKeys
未在JDBC規(guī)范中定義對批處理執(zhí)行的支持,則行為將取決于所使用的驅(qū)動程序。我希望任何支持生成的用于批處理執(zhí)行的鍵的驅(qū)動程序都可以返回ID,以便將它們添加到批處理中。
但是,您使用的事實Set
是有問題的。大多數(shù)集合的迭代順序未定義,并且可能在每次迭代之間發(fā)生變化(通常只有在修改后才能更改,但是從理論上講,您不能假設(shè)有關(guān)該順序的任何信息)。您需要使用保證順序的商品,例如aList
或a LinkedHashSet
。
在這里應(yīng)用多線程可能不是一個好主意:您一次只能使用一個單線程的JDBC連接??紤]到多線程,要么需要正確鎖定,要么需要您分擔(dān)工作負(fù)載,以便可以使用單獨的連接。很難說這會提高還是降低性能。
添加回答
舉報
0/150
提交
取消