Какой размер по умолчанию hibernate.jdbc.fetch_size?

Мы знаем по умолчанию, большинство размеров выборки драйверов jdbc составляют 10.

Кто-нибудь знает, какой размер выборки по умолчанию в спящем режиме, а именно hibernate.jdbc.fetch_size?

Ответ 1

В принципе, все настройки конфигурации используются для создания экземпляра o.h.c.Settings. Это делается с помощью метода o.h.c.SettingsFactory#buildSettings(), который содержит следующие строки:

Integer statementFetchSize = PropertiesHelper.getInteger(Environment.STATEMENT_FETCH_SIZE, properties);
if (statementFetchSize!=null) log.info("JDBC result set fetch size: " + statementFetchSize);
settings.setJdbcFetchSize(statementFetchSize);

Итак, значение null разрешено, оно не будет переведено и будет "распространено" как таковое.

Этот параметр затем используется в o.h.j.AbstractBatcher.java#setStatementFetchSize:

private void setStatementFetchSize(PreparedStatement statement) throws SQLException {
    Integer statementFetchSize = factory.getSettings().getJdbcFetchSize();
    if ( statementFetchSize!=null ) {
        statement.setFetchSize( statementFetchSize.intValue() );
    }
}

Этот частный метод вызывается при подготовке PreparedStatement или CallableStatement. См. prepareQueryStatement и prepareCallableQueryStatement в AbstractBatcher.

Итак, значение по умолчанию null и приводит к тому, что Hibernate не вызывает Statement#setFetchSize().

Это фактически суммируется в справочной документации:

3.4. Дополнительные свойства конфигурации

...

hibernate.jdbc.fetch_size: ненулевое значение определяет размер выборки JDBC (вызовы Statement.setFetchSize())

И вот что должен сказать javadoc о Statement#setFetchSize():

Дает драйвер JDBC подсказка относительно количество строк, которые нужно извлечь из базы данных, когда больше строк необходимых для объектов ResultSet этим выражением. Если значение задано ноль, тогда подсказка игнорируются. Значение по умолчанию равно нулю.

Другими словами, при использовании null fetch_size драйвер JDBC будет использовать значение по умолчанию ноль.

Ответ 2

По умолчанию используется null, то есть нет настроек. Базовая реализация интерфейса Query AbstractQueryImpl внутренне использует RowSelection для отслеживания первой строки, размера выборки и таймаута, Если эти значения null, то значения не установлены в базовом соединении JDBC.

Ответ 3

В языке JDBC размер выборки - это количество строк, физически извлекаемых из базы данных в одно время с помощью драйвера JDBC при прокрутке запроса ResultSet со следующим(). С hibernate.jdbc.fetch_size ненулевое значение определяет размер выборки JDBC, который, в свою очередь, вызывает java.sql.Statement.setFetchSize().

Размер выборки JDBC - это подсказка по оптимизации для драйвера базы данных; это может не привести к повышению производительности, если используемый вами драйвер не реализует эту функциональность. Если это так, это может улучшить связь между клиентом JDBC и вашей базой данных.

Подробнее см. http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html#setFetchSize%28int%29.

Ответ 4

Hibernate (любая реализация JPA) работает на одном уровне выше драйвера JDBC, предоставленного поставщиком БД. поэтому, если мы не укажем размер выборки в конфигурации спящего режима, я предполагаю, что он должен использовать размер выборки по умолчанию, настроенный на уровне драйвера JDBC. Как Oracle - 10, DB2 - 32