質問

この構成があります 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>

示されているように、DataSourceからロードされます <environment id="development">

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

役に立ちましたか?

解決

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

他のヒント

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

build() メソッドSQLSessionFactoryを返す前に、Reader/InputStreamを閉じます。したがって、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);
}

私はそれらを別々のキャッチブロックに入れて、ログファイルで具体的にすぐに失敗したものがわかります。

また、これをシングルトンとして実装して、ロードリソースを1回だけ読み込む必要があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top