Ответ 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.