Hibernate .getResultStream () не потоковое? - PullRequest
1 голос
/ 11 февраля 2020

Я пытаюсь передать много данных из MySQL с Hibernate через .getResultStream(), и я получаю OutOfMemoryErrors.

При первой загрузке строки через некоторое время я получу это исключение, где я вижу:

    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1963) ~[mysql-connector-java-5.1.37.jar:5.1.37]
    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:3308) ~[mysql-connector-java-5.1.37.jar:5.1.37]
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:463) ~[mysql-connector-java-5.1.37.jar:5.1.37]
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:3032) ~[mysql-connector-java-5.1.37.jar:5.1.37]
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2280) ~[mysql-connector-java-5.1.37.jar:5.1.37]
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2673) ~[mysql-connector-java-5.1.37.jar:5.1.37]

, что меня удивляет, так это readAllResults - кажется, это не реальная потоковая передача.

Я также пытался использовать:

query.setHint("org.hibernate.fetchSize", 1000)

Без эффекта.

Затем я обновился до MySQL Connector 8.0.19 и Hibernate 5.4. 11. Финал с тем же эффектом.

1 Ответ

2 голосов
/ 15 февраля 2020

Это правильное наблюдение. Метод getResultStream просто просматривает список результатов как Stream. Согласно документации API :

По умолчанию этот метод делегирует getResultList (). Stream (), однако поставщик сохраняемости может переопределить этот метод для предоставления дополнительных возможностей.

Hibernate выбрал не переопределять этот метод, как видно из QueryImpl и классов, от которых он наследует.

...