如果我有一个简单的java程序,它生成一个准备好的语句来执行sql
select * from person
这个准备好的语句返回一个 ResultSet
,如果另一个进程正在向结果集写入行,则遍历结果集时的行为是什么 person
同时坐在table上?
例如,新添加的行在下面的循环中是否可见
while (resultSet.next()) {
// Some processing
// Which might take a while
}
我在别处读到有可能使用 setFetchSize
控制结果集中返回的行数。
如果我用这个方法,这会改变答案吗(假设行的写入速度比读取和处理速度快)
2条答案
按热度按时间ulmd4ohb1#
从oracle文档:
您可以通过光标访问resultset对象中的数据。请注意,此游标不是数据库游标。此游标是指向结果集中一行数据的指针。最初,光标位于第一行之前。方法resultset.next将光标移动到下一行。如果光标位于最后一行之后,则此方法返回false。此方法使用while循环重复调用resultset.next方法,以遍历resultset中的所有数据。
请参见:https://docs.oracle.com/javase/tutorial/jdbc/basics/retrieving.html
关于你的第二个问题:
我应该在什么时候指定setfetchsize()?
因此,设置要分配多少堆的大小不会改变语义。
x6492ojm2#
原则上,这将取决于驱动程序的实现。但实际上,驱动程序要么将整个结果集加载到内存中,要么使用db游标将更多结果提取到集合中。
在这两种情况下,并行发生的插入都是不可见的。数据库游标通常看不到创建后提交的插入。