2010-04-15 7 views
3

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

+0

В идеале вы должны использовать инструмент построения и структуру проекта, чтобы это не было проблемой. Я рекомендую maven, это может быть немного запутанным и волшебным сначала, но когда вы закончите, это спасет массу времени и обеспечит соблюдение некоторых хороших практик. – nash

ответ

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 
+0

Alex - muchas gracias! Я как раз собирался опубликовать здесь ваш собственный ответ из списка рассылки :) – Bostone

2

В соответствии с этим сайтом: http://codenav.org/code.html?project=/org/mybatis/mybatis/3.2.5&path=/Source%20Packages/org.apache.ibatis.session/SqlSessionFactoryBuilder.java

build() метод закрывает читатель/InputStream перед возвращением 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 повсюду, но это все еще обсуждается.