对于 Hibernate 中的 N+1 查询问题,我添加@BatchSize(size=20)
了集合和类级别。它运行得非常好,因为它每次获取 20 条记录。现在我发现有一个hibernate.jdbc.fetch_size
配置选项,我认为它与@BatchSize
注释相同。但是,当我在项目中配置它时,它对 N+1 查询问题没有影响。
我错了hibernate.jdbc.fetch_size
吗?是hibernate.jdbc.fetch_size
为了什么?
对于 Hibernate 中的 N+1 查询问题,我添加@BatchSize(size=20)
了集合和类级别。它运行得非常好,因为它每次获取 20 条记录。现在我发现有一个hibernate.jdbc.fetch_size
配置选项,我认为它与@BatchSize
注释相同。但是,当我在项目中配置它时,它对 N+1 查询问题没有影响。
我错了hibernate.jdbc.fetch_size
吗?是hibernate.jdbc.fetch_size
为了什么?
这hibernate.jdbc.fetch_size
是一个JDBC 驱动程序配置,它确定:
当 select 语句的结果超过一行时提取的行数
Hibernate 使用此配置来设置PreparedStatement.fetchSize并根据 JDBC 文档:
当此语句生成的 ResultSet 对象需要更多行时,向 JDBC 驱动程序提供有关应从数据库中获取的行数的提示。如果指定的值为零,则忽略提示。默认值为零。
所以这个设置只是一个提示,它允许 JDBC Driver 批量检索选定的行,以最大限度地减少数据库网络往返的次数。
这@BatchSize
是一个Hibernate 获取优化,它控制正在生成的 SELECT 语句的数量。