Что и когда мне следует указывать setFetchSize()?
Я вижу множество руководств по "наилучшей практике" для JDBC/MySQL, в которых говорится, что нужно указывать setFetchSize().
Тем не менее, я понятия не имею, когда указывать и что (оператор, набор результатов) указывать.
Statement.setFetchSize() or PreparedStatement.setFetchSize()
ResultSet.setFetchSize()
- Что из этих двух, что я должен указать?
- Из документации 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