【问题标题】:how to choose dynamic fetchSize in MyBatisMyBatis中如何选择动态fetchSize
【发布时间】:2019-10-15 14:59:41
【问题描述】:

我们希望动态设置特定查询的 fetchSize,以便可以在运行时根据打开的线程总数等前提条件传递大小值。

目前我们使用的是 MyBatis 3.4 图书馆。

下面是我们在应用程序中使用的查询快照。

<select id="fetchDetails" resultType="ItemInformation" useCache="true" timeout="100000" fetchSize="50" statementType="PREPARED">

  SELECT * FROM PR_STAGE
  where 1=1
    AND release_date &gt;= sys_extract_utc(FROM_TZ(cast(TO_DATE(#{fromDate}, 'DD-MON-YYYY HH24:MI:SS')as timestamp),'America/Los_Angeles') )
    AND release_date &lt;= sys_extract_utc(FROM_TZ(cast(TO_DATE(#{toDate}, 'DD-MON-YYYY HH24:MI:SS')as timestamp),'America/Los_Angeles') )

</select>

【问题讨论】:

    标签: java sql select dynamic mybatis


    【解决方案1】:

    你可以写一个插件。

    import java.sql.Statement;
    import java.util.Properties;
    
    import org.apache.ibatis.executor.statement.StatementHandler;
    import org.apache.ibatis.plugin.Interceptor;
    import org.apache.ibatis.plugin.Intercepts;
    import org.apache.ibatis.plugin.Invocation;
    import org.apache.ibatis.plugin.Plugin;
    import org.apache.ibatis.plugin.Signature;
    import org.apache.ibatis.session.ResultHandler;
    
    @Intercepts(@Signature(
      type = StatementHandler.class,
      method = "query",
      args = {
        Statement.class,
        ResultHandler.class }))
    public class FetchSizePlugin implements Interceptor {
    
      private static final ThreadLocal<Integer> FETCH_SIZE = 
          ThreadLocal.withInitial(() -> 100);
    
      public static void setFetchSize(int fetchSize) {
        FETCH_SIZE.set(Integer.valueOf(fetchSize));
      }
    
      @Override
      public Object intercept(Invocation invocation) throws Throwable {
        Statement statement = (Statement) invocation.getArgs()[0];
        statement.setFetchSize(FETCH_SIZE.get());
        return invocation.proceed();
      }
    
      @Override
      public Object plugin(Object target) {
        return Plugin.wrap(target, this);
      }
    
      @Override
      public void setProperties(Properties properties) {
      }
    }
    

    要注册插件,请将以下条目添加到 XML 配置中...

    <plugins>
      <plugin interceptor="pkg.FetchSizePlugin" />
    </plugins>
    

    ...或致电org.apache.ibatis.session.Configuration#addInterceptor()

    注册插件后,您可以在执行查询之前通过调用FetchSizePlugin.setFetchSize() 设置获取大小。

    • 如果不调用该方法,将使用通过withInitial() 设置的值。
    • 由于它使用ThreadLocal,您设置的提取大小将应用于同一线程中的所有后续查询,除非您重新设置其他值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多