什么是hibernate.jdbc.fetch_size的默认大小?

lig*_*ave 12 configuration hibernate jdbc

我们默认知道,大多数jdbc驱动程序的提取大小都是10.

有没有人知道hibernate中的默认提取大小,即hibernate.jdbc.fetch_size是什么?

Pas*_*ent 7

基本上,所有配置设置都用于构建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);
Run Code Online (Sandbox Code Playgroud)

因此,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() );
    }
}
Run Code Online (Sandbox Code Playgroud)

准备a PreparedStatement或a 时调用此私有方法CallableStatement.见prepareQueryStatementprepareCallableQueryStatementAbstractBatcher.

因此,默认值是null并且导致Hibernate没有调用Statement#setFetchSize().

这实际上在参考文档中进行了总结:

3.4.可选配置属性

...

hibernate.jdbc.fetch_size:非零值确定JDBC获取大小(调用 Statement.setFetchSize())

以下是javadoc所说的内容Statement#setFetchSize():

当此Statement生成的ResultSet对象需要更多行时,为JDBC驱动程序提供有关应从数据库中提取的行数的提示.如果指定的值为零,则忽略提示.默认值为零.

换句话说,使用a时null fetch_size,JDBC驱动程序将使用默认值.

  • 实际上,“JDBC 驱动程序将使用默认值为零”这一说法是不正确/不可能的。“获取大小”是当客户端需要/处理结果集行时驱动程序从数据库获取的结果集中的行数。如果大小为零,则不会获取任何行。绝大多数驱动程序的默认值是“10”——对于大多数用例来说,这个值非常低,并且几乎总是应该根据相关查询的用例进行覆盖,并通过堆内存可用性/使用来平衡。 (3认同)
  • _hint_ 的默认值为零,但 Oracle 中的默认值本身为 10:https://vladmihalcea.com/resultset-statement-fetching-with-jdbc-and-hibernate/ (2认同)

Jos*_*iaz 2

在 JDBC 术语中,获取大小是当您使用 next() 滚动查询结果集时 JDBC 驱动程序一次从数据库物理检索的行数。对于 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 。