桃花長(zhǎng)相依
2021-04-05 14:18:41
我executeBatch()與JDBC一起使用以插入多行,并且我想為另一個(gè)插入獲取插入行的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,我的問題是:如果我進(jìn)行迭代,getGeneratedKeys()并且foosHashSetID將以相同的順序返回,以便從數(shù)據(jù)庫返回的每個(gè)ID都屬于對(duì)應(yīng)的Foo實(shí)例?當(dāng)我使用多線程時(shí),上面的代碼同時(shí)在多個(gè)線程中運(yùn)行怎么辦?還有其他解決方案嗎?我有兩個(gè)表foo1和foo2,我想先插入foo1記錄,然后將其主ID用作foo2外鍵。
3 回答

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