java.sql.ResultSet absolute造成out of memory

java.sql.ResultSet 使用absolute方法可以移動ResultSet的指標到想要的筆數,
當 JDBC跟資料庫要資料時,會回傳一個ResultSet,但不是把所有查詢的結果均回傳至Web Server端,
而是只給前面幾筆資料,可以利用ResultSet的方法setFetchSize來設定一次回傳的筆數,
(一次傳的多,等待的時間就比較長,傳的太少,要一直跟資料庫要ResultSet.next()也會比較慢)
當ResultSet向下移動碰觸或是快要碰觸到目前回傳的筆數時,會自動再跟資料庫要設定好的筆數,
而把目前筆數以上的資料全都暫存在記憶體裡。
以上是ResulSet的基本原理,當一次查詢的量夠大時,而利用absolute來移動到想要的Row時,
就有可能發生out of memory的問題,
舉個列子:

Java執行Store Procedure預儲程序

利用JDBC取得Connection後,可以利用以下幾種方式來執行資料庫的Store Procedure
1.沒參數
CallableStatement cs;  try {    // 設定 CallableStatement    cs = connection.prepareCall("{call myproc}");    // 執行 CallableStatement    cs.execute();  } catch (SQLException e) {  } 
 

2.有IN參數

自動取號AutoEnCode-Oracle Stored Procedures

在Oracle裡並沒有像MySql那樣子有自動編號的功能,
如果需要產生不重覆的編號,這時就需要自己動手來做了,
大概的方法有二,不過概念基本上是相同的,
想法,利用一個Table存放編號資料,例如檔頭及碼長及取號的來源(那一個Table)
每次需要取號時則跟此Table要資訊,並把碼長+1存放回去,順便回傳碼長+1
可以利用程式來編寫或是直接在Oracle上寫Sotre Procedures或function
比較建議在Oracle上直接撰寫sp,這樣子不管是其它的SP或是Server上的程式二者均可使用,
不需要另外再行撰寫