2012-08-16 45 views
0

我一直在將不斷增長並且不斷增長的ResultSet加載到內存中,直到現在它還沒有成爲問題。現在太大而不能合理使用。我研究過創建可滾動的結果集,但是我在實現它時遇到了一些麻煩。以下是我已經試過:Java ResultSet內存不足,無法使用PreparedStatement更新

Statement stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY); 
    stmt.setFetchSize(Integer.MIN_VALUE); 
    try { 

     if (stmt.execute("SELECT text, value FROM " + db)) { 
      rs = stmt.getResultSet(); 
     } else { 
      System.err.println("select failed"); 
     } 

是否有我失蹤聲明一些其他的參數?或者還有另一種選擇,我必須在其他地方設置?

編輯:

原來的問題是不是流本身,但我是如何更新RS。我可以不更新RS如果流媒體?控制檯突然離開下列內容:

SQLException: Operation not supported for streaming result sets 
SQLState: S1009 
VendorError: 0 

下面是我使用來更新數據庫已得到處理後的代碼:

rs.getDouble("value"); 
if (rs.wasNull()) { 
StringValue analysis = new StringValue(dict); 
int id = rs.getRow(); 
String entry = rs.getString("text"); 
double val = analysis.analyzeString(entry); 
pst.setDouble(1, val); 
st.setInt(2, id); 
System.out.println(id+": " + val + " : " + rs.getString(5)); 
pst.executeUpdate(); 

預處理語句的結構類似於這樣:

pst = conn.prepareStatement("UPDATE "+ db +" SET value=? WHERE id=?"); 

相當簡單,StringValue方法analyzeString本質上是對輸入字符串的情感分析。

+1

您的問題很可能與ResultSet無關,並且與您如何處理從ResultSet讀取的數據有關。 – jtahlborn 2012-08-16 01:25:44

+1

我同意@jtahlborn。也許你可以發佈一個[SSCCE](http://sscce.org/)版本的代碼供我們查看。 – Sujay 2012-08-16 01:28:05

+0

@Sujay @jthalbom我會的。我認爲我解決了獲取流的問題,現在我得到了一個'SQLException:不支持流式結果集的操作' – 2012-08-16 01:31:47

回答

1

限制您的行:

"select text, value from " + db + " limit 100" 

"select text,value from " + db + " where text like 'A%'" 
0

我勸你加入,以便JVM一些參數放大JVM內存,如-Xmx,-Xms,你可以參考JVM Memory Structure,以獲得更多的細節。

+3

如果您的數據不斷增長,堆大小不增加代碼更改至多是一種權宜之計。 – jtahlborn 2012-08-16 01:30:25

+0

我一直在給它4個演出,現在需要在代碼中修復它。 – 2012-08-16 01:37:22

+0

基於給定的信息,我不知道表結構,也不能找出有關代碼的任何問題,所以我認爲這可能是由於將太多對象加載到內存中造成的。 – Jemyxu 2012-08-16 01:54:49

0

語句stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);

您應該使用 語句stmt = con.createStatement(java.sql.ResultSet.TYPE_SCROLL_SENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE);

+0

原以爲這會起作用,但是我仍然用完堆空間。 – 2012-08-16 03:01:23

+0

http://pastebin.com/MwPYVyF2 – 2012-08-16 03:03:12