hibernate.jdbc.fetch_size 的默认大小是多少?
Posted
技术标签:
【中文标题】hibernate.jdbc.fetch_size 的默认大小是多少?【英文标题】:what's the default size of hibernate.jdbc.fetch_size? 【发布时间】:2011-03-22 06:41:26 【问题描述】:我们知道,默认情况下,大多数 jdbc 驱动程序的 fetch size 都是 10。
有谁知道hibernate默认的fetch size,即hibernate.jdbc.fetch_size是多少?
【问题讨论】:
【参考方案1】:Hibernate(任何 JPA 实现)在 DB 供应商提供的 JDBC 驱动程序之上工作一级。因此,如果我们没有在休眠配置中指定获取大小,我假设它应该采用在 JDBC 驱动程序级别配置的默认获取大小。 像 Oracle - 10,DB2 - 32
【讨论】:
【参考方案2】:基本上,所有配置设置都用于构建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
时会调用此私有方法。请参阅AbstractBatcher
中的prepareQueryStatement
和prepareCallableQueryStatement
。
因此,默认值为null
,导致Hibernate 不调用Statement#setFetchSize()
。
这实际上是在参考文档中总结的:
3.4。可选配置属性
...
hibernate.jdbc.fetch_size
:一个非零值决定了 JDBC 获取大小(调用Statement.setFetchSize()
)
这就是 javadoc 对Statement#setFetchSize()
的评价:
为 JDBC 驱动程序提供一个关于 应该获取的行数 当有更多行时从数据库中 生成的 ResultSet 对象需要 通过本声明。如果值 指定为零,则提示为 忽略。 默认值为零。
换句话说,当使用null
fetch_size
时,JDBC 驱动程序将使用默认值零。
【讨论】:
实际上“JDBC 驱动程序将使用默认值为零”的语句是不正确/不可能的。 “获取大小”是驱动程序从数据库中获取的结果集中的行数,因为在客户端需要/处理结果集行。如果大小为零,它将不会获取任何行。绝大多数驱动程序的默认值是“10” - 对于大多数用例来说,这是非常低的,并且应该几乎总是与相关查询的用例相称地被覆盖,并通过堆内存可用性/使用来平衡。 上面的评论是错误的,“将 fetch size 设置回 0 将导致所有行都被缓存(默认行为)。” jdbc.postgresql.org/documentation/head/query.html默认值为零,表示获取所有行。 hint 的默认值为零,但默认值本身在例如甲骨文是 10:vladmihalcea.com/…【参考方案3】:默认为null
,即无设置。 Query
接口的基本实现AbstractQueryImpl
在内部使用RowSelection 来跟踪第一行、获取大小和超时。如果这些值为null
,则未在底层 JDBC 连接上设置这些值。
【讨论】:
【参考方案4】:在 JDBC 用语中,提取大小是当您使用 next() 滚动查询 ResultSet 时,JDBC 驱动程序一次从数据库物理检索的行数。使用 hibernate.jdbc.fetch_size 一个非零值确定 JDBC 提取大小,进而调用 java.sql.Statement.setFetchSize()
。
JDBC fetch size 是数据库驱动的优化提示;如果您使用的驱动程序没有实现此功能,它可能不会导致任何性能改进。如果是这样,它可以改善 JDBC 客户端和您的数据库之间的通信。
请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/sql/Statement.html#setFetchSize%28int%29 了解更多信息。
【讨论】:
这是一个更正确的答案。在实践中(我已经用“C”编写了驱动程序),setFetchSize() 不仅仅是主要 JDBC 驱动程序(Oracle、IBM 等)中的一个提示。在数据库与 JVM 不在同一主机上的网络中处理大型结果集时,高性能对于高性能至关重要(常见情况)。在大型生产银行系统中,我使用此设置将基于 JDBC 的系统的性能提高了几个数量级。 “提示”部分更多的是关于块大小,例如,为了提高效率,“50”可以实现为“64”。以上是关于hibernate.jdbc.fetch_size 的默认大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章
hibernate.jdbc.fetch_size和hibernate.jdbc.batch_size有什么区别?
hibernate的速度问题--hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size