Posted on 2010-01-03 23:57
leekiang 閱讀(973)
評(píng)論(0) 編輯 收藏 所屬分類:
jdbc、事務(wù)、并發(fā)
resultSetType
的可選值有:
ResultSet.TYPE_FORWARD_ONLY
、ResultSet.TYPE_SCROLL_INSENSITIVE
、ResultSet.TYPE_SCROLL_SENSITIVE
1)
TYPE_FORWARD_ONLY是默認(rèn)值,
僅支持結(jié)果集forward
,不支持滾動(dòng),也不是
SENSITIVE的
2)
ResultSet.TYPE_SCROLL_INSENSITIVE,
支持結(jié)果集backforward ,last
,first
等操作,對(duì)其它session對(duì)數(shù)據(jù)庫中數(shù)據(jù)做出的更改是不敏感的
原因:JDBC對(duì)數(shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢executeQuery時(shí),數(shù)據(jù)庫會(huì)創(chuàng)建查詢結(jié)果的cache和cursor,如下面sql:
??? select name,id from foo
???
用jdbc執(zhí)行上面的sql語句時(shí),數(shù)據(jù)庫會(huì)把foo表所有記錄的name和id字段緩存到cache中,之后cache和真正的數(shù)據(jù)庫數(shù)據(jù)文件沒有任何聯(lián)系了,foo表發(fā)生的改變?cè)诓樵兺瓿珊蟛粫?huì)自動(dòng)同步到cache上去,因此TYPE_SCROLL_INSENSITIVE對(duì)選擇數(shù)據(jù)做出的更改是不敏
感,不可見。
3)ResultSet.TYPE_SCROLL_SENSITIVE
支持結(jié)果集backforward
,last
,first
等操作,對(duì)其它session對(duì)數(shù)據(jù)庫中數(shù)據(jù)做出的更改是敏感的,即其他session
修改了數(shù)據(jù)庫中的數(shù)據(jù),會(huì)反映到本結(jié)果集中
上面的select name,id from foo語句用TYPE_SCROLL_SENSITIVE的Statement來執(zhí)行,會(huì)轉(zhuǎn)化成以下的sql語句:
??? select rowid from foo
??? 數(shù)據(jù)庫這時(shí)候是把foo表所有記錄的rowid緩存到cache中,用戶代碼在fetch記錄時(shí),再繼續(xù)做以下查詢:
??? select name,id from foo where rowid=?
???
因此這時(shí)候發(fā)生的查詢是實(shí)時(shí)從真正的數(shù)據(jù)庫數(shù)據(jù)文件中取,因此對(duì)期間發(fā)生的數(shù)據(jù)更改是可見的,敏感的。但是這種可見性僅限于update操作,而
insert和delete同樣是不可見的。因?yàn)槿绻樵儼l(fā)生在insert之前,insert生成的rowid并不會(huì)反應(yīng)在cache中的rowid結(jié)果集上。在一個(gè)記錄的rowid已經(jīng)緩存到cache中,這時(shí)候被刪除了,但一般數(shù)據(jù)庫的刪除是標(biāo)記刪除,也就是說rowid對(duì)應(yīng)那行記錄并沒有真正從數(shù)
據(jù)庫文件中抹去,一般是可以再次取到記錄的。
結(jié)論:是否SENSITIVE與fetchsize沒有什么關(guān)系。是否SENSITIVE是告訴數(shù)據(jù)庫如何作查詢的緩存。fetchsize是客戶端jdbc的設(shè)置。
另外oracle的fetchsize默認(rèn)為10,
stmt.setFetchSize(0)時(shí)stmt.getFetchSize()=10
stmt.setFetchSize(1)時(shí)stmt.getFetchSize()=1
另外如果查詢的sql復(fù)雜時(shí),我發(fā)現(xiàn)就算設(shè)為ResultSet.TYPE_SCROLL_SENSITIVE也不起作用,如
select t.*? from test t left join testp p on t.pid=p.id where p.title like '%國%',在運(yùn)行中修改title的值,發(fā)現(xiàn)仍然可以取到。是否可以理解為SENSITIVE只對(duì)查詢的主表起作用。
摘自:
http://www.javaeye.com/topic/128636
http://www.javaeye.com/topic/560109
http://www.javaeye.com/topic/418604