Что и когда следует указывать setFetchSize()?

Я вижу множество руководств "лучшей практики" для JDBC/MySQL, которые подсказывают мне указать setFetchSize().

Однако я понятия не имею, когда указывать и что (оператор, набор результатов) указать.

Statement.setFetchSize() or PreparedStatement.setFetchSize() 
ResultSet.setFetchSize()

Javadoc

Значение по умолчанию устанавливается объектом Statement, создающим набор результатов. Размер выборки может быть изменен в любое время.

Oracle Doc

Изменения, внесенные в размер выборки объекта-оператора после создания результирующего набора, не будут влиять на этот результирующий набор.

Пожалуйста, поправьте меня, если я ошибаюсь. Означает ли это, что setFetchSize является только аффективным до того, как выполняется запрос? (Поэтому setFetchSize в ResultSet бесполезен? Но случается так: "Размер выборки может быть изменен в любое время"?)

Ответ 1

Вы должны прочитать эту страницу из официальных документов в наборах результатов. В нем говорится:

По умолчанию ResultSets полностью извлекаются и сохраняются в памяти. В большинстве случаев это самый эффективный способ работы, и благодаря дизайну сетевого протокола MySQL проще реализовать. Если вы работаете с ResultSets, которые имеют большое количество строк или больших значений, и не могут выделять кучу пространства в вашей JVM для необходимой памяти, вы можете сообщить драйверу передать результаты обратно по одной строке за раз.

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                            java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

Комбинация набора результатов только для чтения, только для чтения, с размером выборки Integer.MIN_VALUE служит сигналом для драйвера для потоковых результирующих наборов строк за строкой. После этого любые результирующие наборы, созданные с помощью инструкции, будут извлекаться по строкам.

Фактически, установка только fetchSize не влияет на реализацию соединения-j.

Ответ 2

Нашли хорошую статью с примерами на свой вопрос:

https://www.baeldung.com/jdbc-resultset

7.1. Использование размера выборки в выражении 7.2. Использование Fetch Size на ResultSet