gpt4 book ai didi

java - MyBatis 中如何选择动态 fetchSize

转载 作者:太空宇宙 更新时间:2023-11-04 09:37:08 24 4
gpt4 key购买 nike

我们希望动态设置特定查询的 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>

最佳答案

您可以编写一个插件。

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,您设置的提取大小将应用于同一线程中的所有后续查询,除非您重新设置另一个值。

关于java - MyBatis 中如何选择动态 fetchSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56370034/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com