2012-06-18 73 views
1

對此有另一個可能相關的問題,但它沒有答案,提問者也沒有澄清任何問題。使用PostgreSQL的Java內存不足

所以,當我在postgres中查看一個大的結果集時,java似乎破壞了。

我正在運行的查詢試圖獲得約5.5M行。基本上我試圖從Postgres數據庫填充Neo4J數據庫。

我不會打擾發佈代碼,除非有人問我是否認爲它很通用。下面是異常輸出:52

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.lang.Class.getDeclaredFields0(Native Method) 
    at java.lang.Class.privateGetDeclaredFields(Unknown Source) 
    at java.lang.Class.getDeclaredField(Unknown Source) 
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl.<init>(Unknown Source) 
    at java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater(Unknown Source) 
    at java.sql.SQLException.<clinit>(Unknown Source) 
     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1818) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254) 
    at sqlToGraph.SqlToGraph.main(SqlToGraph.java:52) 

線只是查詢,像這樣:

rs = st.executeQuery("select player_lo, player_hi, total_hands_lo, total_hands_hi, (pc_lo + pc_hi)/2 as avg_pc from pair"); 

所以我想RS越來越蠻大的。我想我可以使用LIMIT和OFFSET並運行程序幾百次,或者讓它在一個循環中重置rs,但我寧願不必。

+0

jdbc驅動程序版本? – leonbloy

回答

5
  1. 將獲取大小設置爲合理的值(st.setFetchSize(rowCount))。你可以試驗這個。
  2. 將所有事務置於關閉自動提交的事務中(con.setAutoCommit(false))。

請參閱this explanationthe documentation

+0

謝謝,這完全解決了它。直到Neo4J使內存耗盡。哦,還有更多問題要問... –