Мы знаем по умолчанию, большинство размеров выборки драйверов jdbc составляют 10.
Кто-нибудь знает, какой размер выборки по умолчанию в спящем режиме, а именно hibernate.jdbc.fetch_size?
Мы знаем по умолчанию, большинство размеров выборки драйверов jdbc составляют 10.
Кто-нибудь знает, какой размер выборки по умолчанию в спящем режиме, а именно hibernate.jdbc.fetch_size?
В принципе, все настройки конфигурации используются для создания экземпляра 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 будет использовать значение по умолчанию ноль.
По умолчанию используется null
, то есть нет настроек. Базовая реализация интерфейса Query
AbstractQueryImpl
внутренне использует RowSelection для отслеживания первой строки, размера выборки и таймаута, Если эти значения null
, то значения не установлены в базовом соединении JDBC.
В языке 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.
Hibernate (любая реализация JPA) работает на одном уровне выше драйвера JDBC, предоставленного поставщиком БД. поэтому, если мы не укажем размер выборки в конфигурации спящего режима, я предполагаю, что он должен использовать размер выборки по умолчанию, настроенный на уровне драйвера JDBC. Как Oracle - 10, DB2 - 32