#java #sql #postgresql #jdbc
#java #sql #postgresql #jdbc
Вопрос:
У меня есть таблица postgres, которая содержит миллионы записей, и я хочу запрашивать ее в пакетах 10.000
. Это означает, что я должен отправить запрос, подобный этому:
SELECT id FROM my_table
и вместо того, чтобы получать миллионы записей, я хочу получить 10.000, затем сохранить их идентификаторы в массиве, сделать что-то с идентификаторами и продолжить чтение следующей партии из 10.000. Есть ли какой-нибудь способ сделать это на Java?
До сих пор я использую подготовленное утверждение следующим образом:
ArrayList<String> ids = new ArrayList<String>();
String sql = "SELECT id FROM my_table ";
PreparedStatement statement = connection.prepareStatement(handleDatabaseSyntax(sql));
ResultSet rs = statement.executeQuery();
while(rs.next())
{
ids.add(rs.getString(1));
}
Я видел PreparedStatement
, что для этого есть некоторая помощь, но я не уверен, как ее использовать. Я ценю любую помощь, которую вы можете предоставить.
Ответ №1:
Используйте setFetchSize
со значением, отличным от 0, чтобы драйвер JDBC не извлекал весь результирующий набор сразу.
Затем выполните цикл, аналогичный тому, как вы это сделали:
statement.setFetchSize(200);
ResultSet rs = statement.executeQuery();
int counter = 0;
while (rs.next())
{
ids.add(rs.getString(1));
if ( counter % 10000 == 0)
{
/* do something with "ids" */
ids.removeAll();
}
}
/* do something with the remaining "ids" */