MyBatis 構成のカスタマイズ可能なタイムアウトを行う方法はありますか?
Spring フレームワークで MyBatis を使用していますが、Spring の PropertyPlaceHolder のように「defaultStatementTimeout」プロパティをカスタマイズ可能にできません。
方法はありますが、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>
私は自分の問題を解決しました。をオーバーライドする必要があり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}
変数でカスタマイズできます。