11个人中只有10楼基本懂JDBC,其它没有一个懂.结果集类型中如果是TYPE_SCROLL_INSENSITIVE的,删除数据库存数据不会影响结果集.但如果是TYPE_SCROLL_SENSITIVE的呢? 这就要看操作类型和数据库具体实现了.一般而言,delete和insert不影响,但update就影响.原因:我们以"select name,age from person"为例 TYPE_SCROLL_INSENSITIVE的结果集是数据库中的cache,也就是上面说的虚拟表,和真实的数据库数据是分离的. 这里在数据库中有一个cache,它保存中查询出来的name,age,和原表脱离. TYPE_SCROLL_SENSITIVE在数据库中也有一张虚拟表,但cache的内容不同.它cache的是记录的rowid(这只是一个名词,不是oracle的rowid) 简单说它保存的是查询到的记录在实际数据库中的索引.当rs.next()时,数据库再根据next定位的rowid却数据库中真实地获取. 即每一次next,数据库都会 select name,age from person where rowid = 当前rowid; 所以如果在查询的时候记录被更新,内容就真实地反映到前端的java的结果集中了. 但是insert操作是新增rowid,并不在cache的rowid中.所以不影响前端的结果集. 而delete操作,一般而言,因为只是在记录上做了一个标记,并没有真正删除记录,对于数据库底层的 select name,age from person where rowid = 当前rowid;而言还是可以取得数据.这一点可以用程序验证出来.做一个TYPE_SCROLL_SENSITIVE类型的ResultSet. 其中的数据手工插入,内容我们预先知道,比如name都是"axman1","axman2"....."axmann". 然后rs.next();每next一次记数加1 .当记数为2时,Thread.sleep(10*1000);在这10秒内你把2以下的其中一个记录的name更新为"xxxxxxx"; 另一条记录删除,可以看到更新的内容反映出来了,但删除的记录照样打印出来,也就是实际没有反映出来.
//www.xinshuguang.org
import java.util.*;
public class xsgNext{
public static void main(String[] args){
List list=new ArrayList();
for(int i=0;i<10;i++)
list.add(i);
Iterator it=list.iterator();
while(it.hasNext())
System.out.println(it.next());
list.remove(new Integer(3));
//有上一句就要重新做遍历器
//用原来的就无法输出了
Iterator itAgain=list.iterator();
while(itAgain.hasNext())
System.out.println(itAgain.next());
}
}
这位大虾是对的,不过要提醒的是一个ResultSet只能有一次next,如果定义了ResultSet st1,st2;
st2=st1;当对st1进行st1.next()后之后,st2.next()就是空了
这就要看操作类型和数据库具体实现了.一般而言,delete和insert不影响,但update就影响.原因:我们以"select name,age from person"为例
TYPE_SCROLL_INSENSITIVE的结果集是数据库中的cache,也就是上面说的虚拟表,和真实的数据库数据是分离的.
这里在数据库中有一个cache,它保存中查询出来的name,age,和原表脱离.
TYPE_SCROLL_SENSITIVE在数据库中也有一张虚拟表,但cache的内容不同.它cache的是记录的rowid(这只是一个名词,不是oracle的rowid)
简单说它保存的是查询到的记录在实际数据库中的索引.当rs.next()时,数据库再根据next定位的rowid却数据库中真实地获取.
即每一次next,数据库都会 select name,age from person where rowid = 当前rowid;
所以如果在查询的时候记录被更新,内容就真实地反映到前端的java的结果集中了.
但是insert操作是新增rowid,并不在cache的rowid中.所以不影响前端的结果集.
而delete操作,一般而言,因为只是在记录上做了一个标记,并没有真正删除记录,对于数据库底层的
select name,age from person where rowid = 当前rowid;而言还是可以取得数据.这一点可以用程序验证出来.做一个TYPE_SCROLL_SENSITIVE类型的ResultSet.
其中的数据手工插入,内容我们预先知道,比如name都是"axman1","axman2"....."axmann".
然后rs.next();每next一次记数加1 .当记数为2时,Thread.sleep(10*1000);在这10秒内你把2以下的其中一个记录的name更新为"xxxxxxx";
另一条记录删除,可以看到更新的内容反映出来了,但删除的记录照样打印出来,也就是实际没有反映出来.