【问题标题】:How to set fetchSize for iBatis select statementiBatis select语句如何设置fetchSize
【发布时间】:2012-01-13 13:05:38
【问题描述】:

我在 Java 中使用 iBatis 作为 ORM 框架。 我有一个选择语句

<select id="getList" resultMap="correctMap">
    SELECT *
    FROM SOME_TABLE
</select>

我正在使用 queryForList 方法:

List<MappedObject> list = getSqlMapClientTemplate().queryForList("getList");

但它会检索大量数据并且此查询的性能很慢。

我对这个问题的假设是 iBatis 具有默认提取大小(例如,在 JDBS 中是 10),所以这就是它如此缓慢的原因。所以我想设置更大的获取大小(例如 1000)。我该怎么做?

还是我看错了?

注意:我需要所有数据,因此在 queryForList 方法中设置最大结果对我来说不是一个合适的解决方案。

List queryForList(String id,
                  Object parameterObject,
                  int skip,
                  int max) 

【问题讨论】:

    标签: java performance ibatis resultset


    【解决方案1】:
    <select id="SELECT_TABLE" parameterType="String" fetchSize="500" resultType="hashmap">
        SELECT * FROM TABLE WHERE NAME = #{value}
    </select>
    

    【讨论】:

    • 是否可以将获取大小设置为全局配置而不是在每个查询配置中?
    • 我不知道。您可以实现插件拦截器(MyBatis 3 用户手册第 17 页),它可能能够在通过它的所有选择查询上设置此属性。对于您的版本,这可能不存在。
    • 我可以动态设置 fetchSize 值吗?
    • 作为记录(我的情况),检索 109k 记录需要 1 分 40 秒。设置 fetchSize=75 将其缩短为 15 秒,fetchsize=500 将其缩短为 4 秒,fetchSize=1000 将其缩短为 2.8 秒,而 fetchSize=2000 将 109,000 行的检索缩短为 2.3 秒。那是在基于 VM 的 oracle 服务器上。您的里程可能会有所不同(也取决于特定的 SQL),但对我来说,最佳位置是 fetchsize 在 500 到 1000 之间。
    【解决方案2】:

    是的,您可以将 fetchSize 设置在更高的级别,而不必担心每次选择都要做。

    第一步

    创建文件mybatis-config.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <settings>
            <setting name="lazyLoadingEnabled" value="false"/>
            <setting name="defaultFetchSize" value="5000"/>
        </settings>
    </configuration>
    

    你可以添加任何 mybatis 支持的值 http://www.mybatis.org/mybatis-3/configuration.html

    第 2 步

    将此作为资源加载到您的配置文件中。这是 Spring 4 示例

    @Value("classpath:mybatis-config.xml")
    private Resource myBatisResource ;
    

    第 3 步:将 SqlSessionFactoryBean 传递给您

    sessionFactory.setConfigLocation(myBatisResource);
    

    注意:我是用 myBatis 3.3.0 完成的。它不适用于 myBatis 3.4.4(存在开放缺陷)

    这将确保所有 select 语句都分配有 fetchSize 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多