Поведение ResultSet с базой данных MySQL, хранит ли оно все строки в памяти? - PullRequest
5 голосов
/ 01 марта 2011

При возврате результатов из запроса выбора сохраняет ли ResultSet все строки в памяти?Или это только ограниченное количество строк?Отличается ли база данных от базы данных?Какое поведение для MYSQL?

Ответы [ 4 ]

4 голосов
/ 01 марта 2011

По умолчанию драйвер MySQL JDBC пытается извлечь все из памяти Java.Поэтому, если вы имеете дело с очень большим количеством строк и / или небольшим объемом памяти, вам нужно сказать, чтобы это не делалось.Это подробно описано в документации по драйверу JDBC .Вот выдержка из релевантности:

ResultSet

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

Чтобы включить эту функцию, необходимо создать экземпляр Statement следующим образом:

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

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

При таком подходе есть некоторые предостережения.Вам нужно будет прочитать все строки в наборе результатов (или закрыть его), прежде чем вы сможете выполнить какие-либо другие запросы для соединения, иначе возникнет исключение.

Для других баз данных (читай: другие драйверы JDBC) вы должны обратиться к его документации.

1 голос
/ 01 марта 2011

ResultSet не хранит все строки, он держит курсор открытым в базе данных.

Точный объем данных, выбранных одновременно, зависит от драйвера (следовательно, он отличается от базы данных к базе данных).

0 голосов
/ 01 марта 2011

Обычно это не указано и может зависеть от базы данных (и драйвера JDBC).

Реализация JDBC, которая всегда содержит все строки в памяти, будет иметь проблемы с действительно большими результатами, в то время как реализации, которые извлекают каждую строку в отдельности, будут иметь низкую производительность (по крайней мере, если база данных находится где-то удаленно).

Таким образом, большинство реализаций извлекают данные в блоках некоторого размера, зависящего от реализации. Я понятия не имею, что будут делать любые драйверы MySQL JDBC.

0 голосов
/ 01 марта 2011

Resultset может хранить все данные, если размер не очень большой.Это зависит от размера выборки.ResultSet setFetchSize - это просто подсказка, но это зависит от драйвера JDBC, который учитывает эту подсказку.Насколько я знаю, драйвер oracle jdbc учитывает подсказку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...