KS
Теоретически, хочется, чтобы данные обрабатывались небольшими пачками. Например, чтобы каждый rs.next забирал очередную пачку из 1000 строк из базы и её обрабатывал.
И Oracle DB даже так по умолчанию работает, правда там размер пачки 10 штук )
Но в PostgreSQL так не работает, и чтобы «курсор» жил какое-то время нужно, чтобы была жива транзакция.
Поэтому setAutoCommit(false) в том примере нужно именно для того, чтобы заработал функционал «выбирать по 50 строк».
Кхм. ровно про это же недавно писал: https://habr.com/ru/post/499794/#comment_21566550
Там, конечно, есть второй вопрос: а почему мы транзакцию не закрываем. Технически, да, надо бы. Но в том конкретном примере, транзакция readonly, и закрывать нечего. Вообще нечего. База создаёт транзакцию только тогда, когда речь доходит до модификации данных (ну или хотя бы блокировки через select for update). Поэтому, после select’а, который как бы readonly, никакой транзакции остаться не может.
Но, да, наверное, логично было бы добавить commit, чтобы не смущать.
Т.е. если у меня, допустим, нет DML-запросов, только select, то я могу вообще не делать commit никогда, просто брать connection из пула, проставлять ему autoCommit = false, делать свои дела и возвращать в пул, не беспокоясь о коммитах (при условии, что пул ничего за мной не чистит и никак не работает с транзакциями)?