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

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

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

Statement.setFetchSize() or PreparedStatement.setFetchSize() 
ResultSet.setFetchSize()
  1. Что из этих двух, что я должен указать?
  2. Из документации javadoc и oracle я не могу понять, когда это происходит.

Javadoc

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

Oracle Doc

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

Пожалуйста, поправьте меня, если я ошибаюсь. Означает ли это, что setFetchSize имеет значение Affective только перед выполнением запроса?(Следовательно, 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.

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

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

7.1. Использование размера выборки в утверждении 7.2. Использование размера выборки для ResultSet

Другие вопросы по тегам