合服時出現的結果集耗盡的現象原因

2021-09-01 18:52:37 字數 696 閱讀 1676

最近,公司準備做合服,我主要負責解決資料庫和資料庫相關底層框架的問題。

我們公司的資料量比較大,兩個目標資料庫每個大小都在兩百多個g左右,合服用的是公司自己的******jpa框架,在合服時,問題出現了,在底層的日誌中顯示出結果集耗盡的問題,我需要查出此問題的原因,並提供出解決方案來。

結果集耗盡說明resultset這個物件做了不應該做的next操作,可是找遍**也未發現相關的錯誤邏輯,於是便想是否會有某些操作暗含了next操作,於是反編譯了下ojdbc6的jar包,發現相關操作未有next操作,於是又仔細看了下底層日誌,發現每次結果集耗盡時,日誌總是有乙個執行緒在跑和合服一樣的sql語句,故想到 是否resultset有快取會被重用,於是去看了oracle.jdbc.driver.oraclepreparedstatement的** ,發現沒有快取resultset 於是又找到oracleresultsetimpl的next實現,發現他本質上是呼叫了close_or_fetch_from_next這個方法 在這個方法中 它呼叫了oraclepreparedstatement的nextstream的屬性 本質上就是將oraclepreparedstatement看成了乙個鍊錶 不斷的往下找到最後乙個nextstream 這裡如果在connection中設定了preparedstatement的快取 則 將會出現問題。所以,解決辦法是 要麼不要啟動那個並行執行相同sql語句的執行緒,要麼不設定connection的預編譯語句的快取。

Mysql查詢當結果集為空時(無結果)的返回值

在作者表中查詢作者名為 我吃西紅 表中不存在 的記錄 author name 我吃西紅 sql select author id from n author where author name author name rs execquery sql link if rs null echo ret...

jdbc 運算元據庫出現 結果集已關閉 的原因

原因 一 在取出結果之前把rs關閉了 這種情況大家都容易發現和解決 原因 二 違背了 jdbc儲存過程先檢索結果,再檢索out引數的順序 片段 如下 callablestatement ps con.preparecall sql ps.registeroutparameter 1,types.in...

多結果集的訪問

using sqlconnection conn new sqlconnection connectstring string cmdtext select top 10 from customers select lastname,firstname from employees sqlcomma...