2

MyBatis 構成のカスタマイズ可能なタイムアウトを行う方法はありますか?

Spring フレームワークで MyBatis を使用していますが、Spring の PropertyPlaceHolder のように「defaultStatementTimeout」プロパティをカスタマイズ可能にできません。

4

3 に答える 3

3

方法はありますが、MyBatis 構成ファイルを介してのみです。必要な設定をロードするために、Spring 構成ファイル ( MyBatis ページにがあります) に MyBatis 構成ファイルの場所を追加できます。

<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>
于 2013-06-21T23:21:06.623 に答える
2

私は自分の問題を解決しました。をオーバーライドする必要があり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>

SqlSessionFactoryBeanタイムアウトを設定するメソッドを上書きする私のカスタム実装buildSqlSessionFactory()(${custom.timeout} を MyBatis 構成ファイルのタイムアウト値に置き換えます)。

@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}変数でカスタマイズできます。

于 2013-06-27T22:16:24.650 に答える