ibatis - выберите среду с помощью XML
-
27-09-2019 - |
Вопрос
У меня есть эта конфигурация в 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
И хочу установить его программно, чтобы использовать тестовую среду?
Решение
SQLSESSEFFORTORYBUILDER.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 сейчас. Таким образом, вам нужно будет открыть новый читатель / поток, чтобы загрузить вторую сеанс. Я обнаружил это, когда я отделил мою учетную запись / таблицы безопасности в отдельной базе данных из основного приложения БД. Мои первые обойдены, я продолжал получать ошибки, когда фасоль пытался загрузить сеанс завод из-за ошибки входного потока (закрытой).
например
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);
}
Хотя я положил их в отдельные попытки поймать блоки, чтобы я знал, какой из них не удалось конкретно прямо в файле журнала.
Я также реализую это как синглтон, чтобы он должен был загружать ресурсы нагрузки один раз.
Контекст: я запускаю это в контейнере Java EE и использую myBatis для прямых запросов вперед и для того, где я бы использовал нативные запросы, поскольку это намного проще и прямая структура. Я мог бы перейти на использование его через JPA повсюду, но это все еще для дебатов.