3

私はこの構成を持っていますibatis-config.xml

<configuration>
    <properties resource="collector.properties"/>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${dev.jdbc.driver}" />
                <property name="url" value="${dev.jdbc.url}" />
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${test.jdbc.driver}" />
                <property name="url" value="${test.jdbc.url}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
    </mappers>
</configuration>

示されているように、それはからデータソースをロードします<environment id="development">

質問:実行時に<environment id="test">XMLを変更せずにスイッチを使用することは可能ですか?たとえば、使用しているテストファイルがあり、SqlSessionFactoryテスト環境を使用するようにプログラムで設定したいですか?

4

2 に答える 2

7

SqlSessionFactoryBuilder.build()メソッドは、XMLで特定の環境を選択できます。

例えば、

private Reader reader;
private SqlSessionFactory sqlSessionFactorys;
private SqlSession session;

reader = Resources.getResourceAsReader("ibatis-config.xml");

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "test");
testSession = sqlSessionFactorys.openSession(); // test env

sqlSessionFactorys = new SqlSessionFactoryBuilder().build(reader, "development");
devSession = sqlSessionFactorys.openSession(); // dev env
于 2010-04-28T01:02:41.947 に答える
2

このサイトによると: http ://codenav.org/code.html?project = / org / mybatis / mybatis / 3.2.5&path = / Source%20Packages / org.apache.ibatis.session / SqlSessionFactoryBuilder.java

このbuild()メソッドは、SqlSessionFactoryを返す前に、リーダー/入力ストリームを閉じます。したがって、2番目のセッションをロードするには、新しいリーダー/ストリームを開く必要があります。これは、アカウント/セキュリティテーブルをメインアプリケーションDBとは別のデータベースに分離したときに発見しました。私の最初の回避策では、入力ストリームエラー(閉じた)が原因でBeanがセッションファクトリを読み込もうとしたときにエラーが発生し続けました。

例えば

try {
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH);
    prodDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, prodDbEnvironment);
    inputStream = Resources.getResourceAsStream(MYBATIS_CONFIG_PATH);
    securityDbSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, securityDbEnvironment);
} catch (IOException ex) {
    String msg = "Unable to get SqlSessionFactory";
    CustomizedLogger.LOG(Level.SEVERE, this.getClass().getCanonicalName(), "methodName", msg, ex);
}

私はそれらを別々のtrycatchブロックに入れましたが、ログファイルでどれが具体的に失敗したかをすぐに知ることができます。

また、これをシングルトンとして実装しているため、ロードリソースを1回ロードするだけで済みます。

コンテキスト:これをJava EEコンテナーで実行し、MyBatisを使用して、単純なクエリと、はるかに単純で単純なフレームワークであるネイティブクエリを使用します。私はどこでもJPAを介してそれを使用するように切り替えるかもしれませんが、それはまだ議論の余地があります。

于 2014-12-03T23:49:49.590 に答える