2015年6月11日 星期四

ibatis 未開啟游標CRSR0001

「未開啟游標CRSR0001」
我覺得這個問題是個鬼...
然後因為Google不認識這個鬼...所以只好自己抓...

先註明一下這邊使用的版本:
ibatis 2.3.4
ibatis dao 2


原本都好好的沒事,然後就有一天被念說畫面出Exception了(很好心的寫了中文字,但...沒幫助阿|||Orz...照翻成英文,Google也不認識~Google只認識 沒關,沒有沒開的阿~囧rz)

因為程式很久沒改過,當然先懷疑是不是有人亂Key資料~DB看來看去,資料也很正常~

然後拿相同的SQL直接去DB查~整叢好好的(台)
所以DB資料錯誤問題排除...

再來就只好看程式了(不能推卸責任了Orz...)開啟全部的Log來看~發現其實他查回來的ResultSet 也是完整的,一筆也沒掉...
那所以一定是 ibatis 將資料轉成 Bean物件出事...

可是=.=|||...ibatis都照標準範本寫,是可以改什麼阿阿阿Orz...

是說我覺得這明明是一個很蠢的問題,筆數不過3xx就掛....又不是幾千萬(是說其他撈出來幾萬的function也活得好好的阿@@)...然後蠢問題的解答通常也很蠢...所以往蠢的方向去想...

把原本的 resultMap 改成 resultClass... 就...好...了...
(先說這 resultMap也是單純到不行的 1欄位 對 1欄位,還沒有做額外查詢)

-----------------------------------------
是說解法果然是很蠢...不過這說明了 ibatis 對於 resultMap 與 resultClass的處理方式明顯不一樣,先說我沒去讀他的source code,只從結果推論。

 resultClass 是比較偏像我心中的 ResultSet 拿出來就持續 next 往下填資料。

而 resultMap 則可能是依其對應的 pojo 與DB回傳欄位 的結構定義,先預支了一堆資源什麼的,然後不知道什麼蠢問題,造成他在 mapping時 出錯了~(筆數這麼少,欄位對應1對1這麼單純還出錯真是...)
-----------------------------------------

總之,結論就是,如果可以用 resultClass 實作,請優先使用 resultClass,減少不必要的困擾~~(是說找到的sample code,覺得 resultMap的還挺多的,當然是說map彈性比較大就是~)


沒有留言: