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

时间:2010-07-28 16:44:00

标签: hibernate jdbc configuration

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

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

4 个答案:

答案 0 :(得分: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);

因此,允许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() );
    }
}

准备PreparedStatementCallableStatement时会调用此私有方法。请参阅prepareQueryStatement中的prepareCallableQueryStatementAbstractBatcher

因此,默认值为null,导致Hibernate未调用Statement#setFetchSize()

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

  

3.4。可选配置属性

     

...

     

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

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

  

为JDBC驱动程序提供提示   应该获取的行数   从更多行的数据库   ResultSet对象生成所需的   通过本声明。如果值   指定为零,然后提示为   忽略。 默认值为零

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

答案 1 :(得分:2)

在JDBC用语中,当您使用next()滚动查询ResultSet时,获取大小是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

答案 2 :(得分:2)

默认值为null,即无设置。 Query接口的基本实现AbstractQueryImpl在内部使用RowSelection来跟踪第一行,获取大小和超时。如果这些值为null,则不在基础JDBC连接上设置值。

答案 3 :(得分:0)

Hibernate(任何JPA实现)都比数据库供应商提供的JDBC驱动程序高一级。所以如果我们不在hibernate配置中指定获取大小,我假设它应该采用在JDBC驱动程序级别配置的默认提取大小。 像Oracle - 10,DB2 - 32