MyBatis上的可自定义超时

时间:2013-06-21 22:08:54

标签: java spring mybatis

有没有办法为MyBatis配置执行可自定义的超时?

我正在使用MyBatis和Spring框架,但我无法生成' defaultStatementTimeout'属性可自定义,如Spring上的PropertyPlaceHolder。

3 个答案:

答案 0 :(得分:1)

有一种方法,但只能通过MyBatis配置文件。您可以在Spring配置文件中添加MyBatis配置文件的位置(MyBatis页面中有example)以加载您想要的settings

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="location" value="classpath:mybatis-config.xml" />
</bean>

MyBatis配置文件可以是:

<?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="defaultStatementTimeout" value="10"/> <!-- seconds -->
    </settings>
</configuration>

答案 1 :(得分:0)

我已经解决了我的问题。我必须使用SqlSessionFactoryBean

覆盖CustomSqlSessionFactoryBean.
<bean id="sqlSessionFactory" class="com.myapp.CustomSqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:sql-config.xml" />
    <property name="timeout" value="${custom.timeout}" />
</bean>

我的MyBatis配置文件看起来像

<configuration>
    <settings>
        <setting name="defaultStatementTimeout" value="${custom.timeout}"/>
    </settings>
</configuration>

My SqlSessionFactoryBean的自定义实现覆盖buildSqlSessionFactory()方法,该方法设置超时(在MyBatis配置文件中用超时值替换$ {custom.timeout})。

@Override
protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
    String strConfig = IOUtils.toString(CustomSqlSessionFactoryBean.class.getResourceAsStream(MYBATIS_CONFIG_PATH));
    strConfig = StringUtils.replace(strConfig, TO_REPLACE, String.valueOf(timeout));
    InputStream inputStream = IOUtils.toInputStream(strConfig);
    setConfigLocation(new CustomClasspathResource(inputStream, strConfig));
    return super.buildSqlSessionFactory();
}

这个类允许我将修改后的输入流设置为setConfigLocation方法。

class CustomClasspathResource extends ClassPathResource {

    private InputStream inputStream;

    @Override
    public InputStream getInputStream() throws IOException {
        return inputStream;
    }

    private CustomClasspathResource(InputStream inputStream, String path) {
        super(path);
        this.inputStream = inputStream;
    }

因此,可以使用${custom.timeout}变量自定义超时。

答案 2 :(得分:0)

对于Spring Batch,可以使用bean上的属性“timeout”在SystemCommandTasklet上设置自定义超时

<bean id="FlxxtUpdaterTasklet" class="org.springframework.batch.core.step.tasklet.SystemCommandTasklet">
    <property name="command" value="xxx" />
    <property name="timeout" value="3600000" />
    <property name="interruptOnCancel" value="true" />
    <property name="terminationCheckInterval" value="5000" />
</bean>

使用Mybatis在mapper语句中使用属性“timeout”覆盖Statement Timeout:

    <mapper namespace="com.xxxx.blsf.batch.mapperbls.Bls2CsvMapper">
        <select id="bls2csv" parameterType="com.xxxx.blsf.batch.mapperparams.SpParamInteger" 
            statementType="CALLABLE" timeout="6000" >
            { CALL PKG_BLACKLIST_PLUS_RC.BLS_2_CSV(#{rcInt, mode=OUT, jdbcType=INTEGER, javaType=java.lang.Integer})}
        </select>
    </mapper>