从具有3000000行的表的Java中读取行

时间:2019-06-08 21:41:42

标签: java sql postgresql jdbc

我想读取具有30000000行的表的行。我曾经用过try/catch,以为我将在10000个数据包中获得30000000行,但是我仅获得前10000行,并且程序结束。请谁能告诉我如何在10000个数据包中获取所有30000000行?

st.setFetchSize(10000)

1 个答案:

答案 0 :(得分:3)

阅读文档,即createStatement​(int resultSetType, int resultSetConcurrency, int resultSetHoldability)的Javadoc:

  

参数:

     

resultSetType-以下ResultSet常量之一:ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVEResultSet.TYPE_SCROLL_SENSITIVE

     

resultSetConcurrency-以下ResultSet常量之一:ResultSet.CONCUR_READ_ONLYResultSet.CONCUR_UPDATABLE

     

resultSetHoldability-以下ResultSet常量之一: ResultSet.HOLD_CURSORS_OVER_COMMITResultSet.CLOSE_CURSORS_AT_COMMIT

您的代码是:

Statement st = connection.createStatement(
                  ResultSet.TYPE_FORWARD_ONLY, // Good
                  ResultSet.CONCUR_READ_ONLY,  // Good
                  ResultSet.FETCH_FORWARD      // BAD !!!!!
               );

如您所见,第三个参数不是有效值之一。不是

由于您在connection.commit();循环中调用while(rs.next()),因此如果您通过 ResultSet.HOLD_CURSORS_OVER_COMMIT ,对您来说会更好。


当然,您甚至都不应该这样做,因为3000000 INSERT语句将永远占用,尤其是如果您分别提交每个语句。 赞!

如果必须这样做,因为您需要使用Java处理数据,请至少使用批处理

相反,只需将其编写为单个语句即可:

INSERT INTO contrato ( contrato, codigo_postal, cups )
SELECT contrato, codigo_postal, cups
FROM contratacion
ON CONFLICT (contrato) DO UPDATE
SET codigo_postal = excluded.codigo_postal
  , cups = excluded.cups