我想读取具有30000000行的表的行。我曾经用过try/catch
,以为我将在10000个数据包中获得30000000行,但是我仅获得前10000行,并且程序结束。请谁能告诉我如何在10000个数据包中获取所有30000000行?
st.setFetchSize(10000)
答案 0 :(得分:3)
请阅读文档,即createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
的Javadoc:
参数:
resultSetType
-以下ResultSet
常量之一:ResultSet.TYPE_FORWARD_ONLY
,ResultSet.TYPE_SCROLL_INSENSITIVE
或ResultSet.TYPE_SCROLL_SENSITIVE
resultSetConcurrency
-以下ResultSet
常量之一:ResultSet.CONCUR_READ_ONLY
或ResultSet.CONCUR_UPDATABLE
resultSetHoldability
-以下ResultSet
常量之一:ResultSet.HOLD_CURSORS_OVER_COMMIT
或ResultSet.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