В JDBC, setFetchSize(int)
методът е много важен за производителността и управлението на паметта в JVM, тъй като контролира броя на мрежовите повиквания от JVM към базата данни и съответно количеството RAM, използвано за обработка на ResultSet.
По същество, ако setFetchSize(10) се извиква и драйверът го игнорира, вероятно има само две опции:
- Опитайте с друг JDBC драйвер, който ще спазва съвета за размер на извличане.
- Разгледайте специфичните за драйвера свойства на връзката (URL и/или карта на свойствата, когато създавате екземпляра на връзката).
RESULT-SET е броят на редовете, маршалирани в DB в отговор на заявката. ROW-SET е частта от редове, които се извличат от RESULT-SET на извикване от JVM към DB. Броят на тези повикванията и получената RAM памет, необходима за обработка, зависят от настройката за размера на извличане.
Така че, ако RESULT-SET има 100 реда и размерът на извличане е 10, ще има 10 мрежови обаждания за извличане на всички данни, като се използват приблизително 10*{row-content-size} RAM във всеки даден момент.
Размерът на извличане по подразбиране е 10, което е доста малко. В публикувания случай изглежда, че драйверът игнорира настройката за извличане, извличайки всички данни с едно повикване (изисква се голямо RAM, оптимално минимално мрежови обаждания).
Какво се случва под ResultSet.next()
е, че всъщност не извлича ред по ред от RESULT-SET. Той извлича това от (локалния) ROW-SET и извлича следващия ROW-SET (невидимо) от сървъра, когато се изчерпва на локалния клиент.
Всичко това зависи от драйвера, тъй като настройката е само „подсказка“, но на практика открих, че така работи за много драйвери и бази данни (проверено в много версии на Oracle, DB2 и MySQL).