使用PostgreSQL的Java内存不足

时间:2012-06-18 15:25:28

标签: java postgresql memory

还有另一个可能相关的问题,但它没有答案,提问者没有澄清任何问题。

因此,当我在postgres中查看大型结果集时,java似乎已经破解。

我正在运行的查询试图获得大约5.5M行。基本上我正在尝试从Postgres数据库填充Neo4J数据库。

我不打算发布代码,除非有人问我认为这是非常通用的。这是异常输出:

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)

第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,但我宁愿不必。

1 个答案:

答案 0 :(得分:6)

  1. 将获取大小设置为合理的值(st.setFetchSize(rowCount))。你可以试试这个。
  2. 将所有内容放入自动提交关闭(con.setAutoCommit(false))的交易中。
  3. 请参阅this explanationthe documentation