iBatis - выбрать среду, используя XML - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть эта конфигурация в 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 и хочу установить его программно для использования тестовой среды?

Ответы [ 2 ]

7 голосов
/ 28 апреля 2010

Метод 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
2 голосов
/ 04 декабря 2014

По данным этого сайта: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

Метод build() закрывает считыватель / inputtream перед возвратом SqlSessionFactory. Таким образом, вам нужно будет открыть новый читатель / поток для загрузки второго сеанса. Я обнаружил это, когда отделил свои учетные записи / таблицы безопасности от отдельной базы данных от основной базы данных приложения. В первый раз я продолжал получать ошибки, когда бин пытался загрузить фабрику сеансов из-за ошибки входного потока (закрыт).

, например

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);
}

Несмотря на то, что я поместил их в отдельные блоки try catch, я точно знаю, какой из них вышел из строя в файле журнала.

Я также реализовал это как синглтон, чтобы он загружал ресурсы только один раз.

Контекст: я запускаю это в контейнере Java EE и использую MyBatis для прямых запросов и для тех мест, где я буду использовать собственные запросы, поскольку это гораздо более простая и понятная среда. Я мог бы переключиться на использование его через JPA везде, но это еще предстоит обсудить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...