MyBatis + OSGi: как удалить мапперы динамически

У меня есть и архитектура OSGi, и я использую xml mappers + интерфейсы (как рекомендуется).

Файл конфигурации Mybatis я помещаю в папку glassfish / domains / domain1 / config. Эта конфигурация загружается при первом вызове MyBatisConnectionFactory. Это нормально.

Теперь у каждого бандла есть свои мапперы. Я могу добавить их динамически, поставив

com.acme.myproject.MyMapper и com / acme / myproject / MyMapper.xml в соответствующие папки и в активаторе

public void start(BundleContext context) throws Exception {
    getSqlSessionFactory().getConfiguration().addMapper(MyMapper.class);
}

Вроде работает. Когда мой пакет запускается, в конфигурацию добавляются мапперы. Проблема в том, что если я обновлю пакет, изменения не вступят в силу, пока я не перезапущу свой домен glassfish. Насколько я понимаю, я должен сначала удалить предыдущие картографы, но не могу найти способ сделать это. Помогите, пожалуйста.


person Community    schedule 15.06.2014    source источник


Ответы (2)


Похоже, эта проблема была открыта MyBatis несколько лет назад и закрыта как не будет исправлена ​​, но они предоставили обходной путь: http://code.google.com/p/mybatis/issues/detail?id=98.

Ссылка на код не работает, но концептуальный обходной путь остается, и соответствующий файл, вероятно, можно отследить в log4j.

Вот одно место, где хранится код, по всей видимости, он из Maven Central: http://grepcode.com/file/repo1.maven.org/maven2/log4j/log4j/1.2.14/org/apache/log4j/helpers/FileWatchdog.java

Вкратце они рекомендуют:

Вам просто нужно перезагрузить SqlSessionFactory, вызвав SqlSessionFactoryBuilder.build, когда вы обнаружите, что файл был изменен.

person khampson    schedule 16.06.2014

BundleActivator также имеет метод stop (), который вызывается, когда пакет останавливается, но это не сработает, потому что iBatis / MyBatis, похоже, не имеет метода removeMapper () или его эквивалента - это означает, что единственный способ динамически удалять сопоставления это выключить и перезапустить ...

person Tassos Bassoukos    schedule 16.06.2014
comment
В этом случае мы теряем все преимущества osgi. Нет никакого способа? - person ; 16.06.2014
comment
Это концептуальное несоответствие импеданса между MyBatis и OSGi; я бы предложил создать службу, которая отслеживает конфигурацию MyBatis, обертывает MyBatis и перезапускает только MyBatis (если это вообще возможно) при изменении конфигурации. - person Tassos Bassoukos; 16.06.2014