2012-04-26 25 views
0

我在清理完成的很差,大,web應用。我無法一次完成所有事情,所以我正在把它分解。有一兩件事我想這樣做是實現與採用SQL語句,然後返回一個集合函數的類。我的計劃是,一旦被照顧,我可以貨比三家數據庫的框架,以取代層,而不會干擾Web應用程序的其餘部分。CachedRowSet的,是ResultSetDynaClass或其他集合?

的大問題,返回一個結果出來模板風格的數據庫訪問功能的是,我不能關閉而沒有禁止的ResultSet的連接。

我很興奮地發現這個老stackoverflow post的建議。

我讀過CachedRowSet上引用的文章,但是我擔心文章中提到它的使用可能會通過將大量結果填充到自身中來吸引大量JVM內存而產生問題。

會不會替代阿帕奇ResultSetDynaClass或任何其他集合有同樣的問題?結果必須以某種方式寫入存儲器。對?

如果我用ChaedRowSet,是ResultSetDynaClass或Java集合來存儲數據結果集,我會丟失數據,一旦我關閉了ResultSet的?

我用包含HashMap存儲從通用數據庫查詢功能單一記錄。

我如何使用Java集合來存儲多個記錄沒有代碼越來越繁瑣?假設我可以,比其他兩種方案更有效率或更靈活嗎?

感謝您的任何資料或意見。

回答

1

因爲這是一個網絡應用程序,所以您知道何時需要關閉結果集:請求結束時。您可以在請求範圍內註冊您的結果集/連接,並關閉它們都在請求結束。這就是Cold Fusion(在Java之上運行)處理它的方式。

或者你可以像Myna那樣做,並默認返回一個「實體化」集合,或者採用一個可選的行處理器,它將針對原始結果集執行。在第二種情況下,您可以直接訪問像BLOB這樣的東西,這些東西幾乎總是需要特殊處理,並且不適合填入集合中,並且您知道rowHandler何時完成,因此您可以關閉結果集/連接

UPDATE:

這裏是近距離時請求末端方法

public class Query { 
    static public ConcurrentHashMap  openResultSets = new java.util.concurrent.ConcurrentHashMap(); 
    public ResultSet runQuery(String sql) throws SQLException{ 
     //set up connection, run query 
     ResultSet rs = statement.executeQuery(); 
     if (Query.openResults.get(Thread.currentThread().getId()) == null){ 
      Query.openResults.put(Thread.currentThread().getId(),new Vector()) 
     } 
     Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId()) 

     openRs.add(rs); 
     return rs; 
    } 
    public void onRequestEnd(String sql) { 
     Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId()); 
     if (openRS != null){ 
      for (ResultSet rs : openRS.values()){ 
       try{ 
        rs.close(); 
       } catch(Exception e){} 
      } 
     } 
     //do any other request end cleanup of connections, etc 
    } 
} 

//in your servlet 
public class Query extends HttpServlet { 

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ 

     ResultSet rs = Query.runQuery("select * from AWESOME"); 
     //do awesome stuff, maybe load other classes that can run runQuery 

     Query.onRequestEnd(); 
    } 
} 

這是不理想的一個簡單的例子,但我不知道你使用的是什麼框架。通過setAttribute()/ getAttribute()將它保存在HttpServletRequest對象中可能是有意義的,但這需要將請求傳遞給每個使用它的方法。無論哪種方式,您只需保留一組打開的結果集,並在請求結束時關閉它們。使用某種框架可以讓這個過程更容易。

+0

你寫的所有內容對我來說都是100%新的,所以我不明白你說的一個字。你提到的第一種方法聽起來是最可取的。你能發佈一個例子和描述的鏈接嗎? – Steve 2012-04-26 19:09:35