Mysql
 sql >> база данни >  >> RDS >> Mysql

Поточно предаване на големи набори от резултати с MySQL

Само задаването на размера на извличане не е правилният подход. javadoc на Statement#setFetchSize() вече посочва следното:

Дава на JDBC драйвера подсказка относно броя на редовете, които трябва да бъдат извлечени от базата данни

Драйверът всъщност е свободен да приложи или да игнорира намека. Някои драйвери го игнорират, някои драйвери го прилагат директно, някои драйвери се нуждаят от повече параметри. MySQL JDBC драйверът попада в последната категория. Ако проверите MySQL JDBC драйвер документация , ще видите следната информация (превъртете около 2/3 надолу до заглавката ResultSet ):

За да активирате тази функционалност, трябва да създадете екземпляр на Statement по следния начин:

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

Моля, прочетете цялото раздел на документа, той описва и предупрежденията на този подход. Ето подходящ цитат:

Има някои предупреждения при този подход. Ще трябва да прочетете всички редове в набора от резултати (или да го затворите), преди да можете да зададете каквито и да било други заявки за връзката, или ще бъде изведено изключение.

(...)

Ако изявлението е в обхвата на транзакция, тогава заключванията се освобождават, когато транзакцията завърши (което предполага, че изявлението трябва да завърши първо). Както при повечето други бази данни, операторите не са завършени, докато не бъдат прочетени всички чакащи резултати в оператора или не се затвори активният набор от резултати за оператора.

Ако това не коригира OutOfMemoryError (не Exception ), тогава проблемът вероятно е, че съхранявате всички данни в паметта на Java, вместо да ги обработвате незабавно веднага щом данните постъпят. Това ще изисква повече промени във вашия код, може би пълно пренаписване. Отговорих на подобен въпрос преди тук .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:ДА) (Mysql::Error)

  2. Пребройте случаите на DISTINCT стойности

  3. Как да се присъедините към MySQL и Postgres в материализиран изглед на живо

  4. SQL:Какво е по подразбиране Подреждане по на заявките?

  5. Най-ефективният начин за получаване на броя на редовете в таблицата