Могу ли я загрузить транк данных MySQL транк в Java? - PullRequest
0 голосов
/ 16 июля 2010

В настоящее время я использую statement.executeQuery(qStr) в Java, чтобы выбрать большой объем данных из MySQL. К сожалению, у java не хватает памяти в операторе statement.executeQuery(qStr) с исключением java.lang.OutOfMemoryError: Java heap space. Мне интересно, если есть метод для потоковой загрузки данных из MySQL. Чтобы я мог обработать выбранную магистраль данных за магистралью, чтобы избежать нехватки памяти?

Обратите внимание, что: я использую eclipse, и этот post показывает мне, как увеличить кучную память для java для использования внутри eclipse. Но после того, как я следовал его методу, я все еще сталкиваюсь с той же проблемой.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 16 июля 2010

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

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

Это создает

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

См. Документацию MySQL для получения более подробной информации и предостережений: http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html

1 голос
/ 16 июля 2010

Да, вы можете установить FetchSize в операторе в Integer.MIN_VALUE, ResultSet должен быть TYPE_FORWARD_ONLY также, хотя я считаю, что это значение по умолчанию .. MySQL обрабатывает это специально и разрешает потоковую передачу ResultSet вместо чтения всего этого в память, это задокументировано здесь

PreparedStatement stmt =  
 conn.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...