我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将以相同的顺序返回,以便从数据库返回的每个ID都属于对应的Foo实例?当我使用多线程时,上面的代码同时在多个线程中运行怎么办?还有其他解决方案吗?我有两个表foo1和foo2,我想先插入foo1记录,然后将其主ID用作foo2外键。
3 回答
慕田峪7331174
TA贡献1828条经验 获得超13个赞
如果getGeneratedKeys
未在JDBC规范中定义对批处理执行的支持,则行为将取决于所使用的驱动程序。我希望任何支持生成的用于批处理执行的键的驱动程序都可以返回ID,以便将它们添加到批处理中。
但是,您使用的事实Set
是有问题的。大多数集合的迭代顺序未定义,并且可能在每次迭代之间发生变化(通常只有在修改后才能更改,但是从理论上讲,您不能假设有关该顺序的任何信息)。您需要使用保证顺序的商品,例如aList
或a LinkedHashSet
。
在这里应用多线程可能不是一个好主意:您一次只能使用一个单线程的JDBC连接。考虑到多线程,要么需要正确锁定,要么需要您分担工作负载,以便可以使用单独的连接。很难说这会提高还是降低性能。
添加回答
举报
0/150
提交
取消