MyBatis+OSGi: как да премахнете картографите динамично

Имам и OSGi архитектура и използвам xml mappers+интерфейси (както се препоръчва).

Конфигурационният файл на Mybatis поставих в папка glassfish/domains/domain1/config. Тази конфигурация се зарежда при първото извикване на MyBatisConnectionFactory. Това е добре.

Сега всеки пакет има свои собствени карти. Мога да ги добавя динамично чрез поставяне

com.acme.myproject.MyMapper и com/acme/myproject/MyMapper.xml в относителни папки и в Activator

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