簡體   English   中英

java中的大型sql結果集

[英]large sql resultsets in java

如何在java中獲取大型結果集? 我有大約140,000行,3列。

沒有特殊方法可以檢索大型結果集; 這可以通過JDBC與任何其他數據庫查詢相同。

關鍵在於如何處理結果。 140,000個小記錄不是太多,但如果將它們全部保存在應用程序內存中是一個問題,請考慮它們是否可以“流向”處理。 也就是說,使用每條記錄所需的信息,然后在檢索下一條記錄之前丟棄該記錄。 這樣,內存要求不依賴於結果集中的記錄數。

(使用java.sql.Connection到您的數據庫):

Statement st = cnxn.createStatement();
ResultSet rs = st.executeQuery("SELECT column1,column2,your_mom FROM some_table");

while(rs.next()){
  Object ob1 =  rs.getObject(1);
  Object ob2 =  rs.getObject(2);
  Ho ob3 =  rs.getHo(3);
  doStuffWithRow(ob1,ob2,ob3);
}

除非您的DBMS在可憐的情況下無用,否則將根據請求從磁盤/內存中讀取結果,並且不會在您的內存或任何類似的瘋狂內容中找到結果。 使用基於原語的ResultSet.getXXX方法比getObject快,但我不想指定列類型。

請耐心等待,讓我們突然說。 哦,在這里趕緊離開ORM吧。

如果您正在使用PostgreSQL,則需要按如下方式設置Connection和Statement:

Connection cnxn = ...;
cnxn.setAutoCommit(false);   
Statement stmnt = cnxn.createStatement();
stmnt.setFetchSize(1);

否則,您的查詢可能會嘗試將所有內容加載到內存中。 感謝http://abhirama.wordpress.com/2009/01/07/postgresql-jdbc-and-large-result-sets/用於記錄。

我建議使用批處理樣式獲取而不是加載所有內容。 在執行具有大結果集的查詢時,數據庫端存在性能注意事項。

我會避免使用任何類型的復雜抽象加載這樣的數據集。 這聽起來像一個“批處理作業”風格的應用程序。

我建議使用原始的jdbc並將其映射到一個非常緊湊的表示,沒有膨脹,只有3個colums這應該相當容易保存在內存中,如果字符串? 不是太大了。

避免使用hibernate等工具加載140k行。 它是一個很棒的工具,但是如果你在hibernate 1st和2nd級緩存中擁有那么多實體,你可能會遇到內存問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM