Friday, June 18, 2010

ha-jdbc

Введение
Существует такая неплохая библиотека как ha-jdbc. Служит для кластеризации баз данных на уровне приложения. В процессе работы пишет одновременно в n баз, читает согласно тому как будет произведена настройка (load, random и т.д.). На сайте описано как работать с ней в jboss, но мне в процессе работы пришлось попытаться прикрутить её к продуктам wso2.


Веселье начинается...
Подключение для jboss есть на оффсайте, если хотите подключить ещё где, добро пожаловать в ... сорцы. В процессе разбора кода было найдено, что подключать можно и через jdbc драйвер, главное указать правильно драйвер.
Для примера для кластера test можно использовать jdbc:ha-jdbc:test. После этого как и описано на сайте конфигурация для данного кластера начинается искать в ha-jdbc-test.xml

... и продолжается.
  1. Так как любит хранить настройки в ~/.java/.userPrefs , то после первой инициализации кластера второй раз, даже если поменяли что-то в конфиг файле, список баз и их id из него перечитывать НЕ БУДЕТ, просто упадёт с ошибочкой "не знаю к какой ты меня базе пытаешься подключить, нету таких баз" (для фряхи если даже и добавить для пользователя от кого ява запускается хоум, там всё равно ничего не будет, по крайней мере для версии 1.6.0_10 этот баг в яве на юникс системах ещё не был поправлен, а более свежую сложно найти на этой системе)

  2. Использует для мэпинга на xml-конфиги чудесную библиотеку jixb, которая в свою очередь работает через <покоцано цензурой>. Внутри jboss работает на ура, всё мапится красиво, но стоит попытаться заюзать её в локал приложении или ещё где, сразу падаем с ошибкой вида:

    Caused by: org.jibx.runtime.JiBXException: Expected "cluster" end tag, found "xa-datasource" start tag (line 4, col 1)
    at org.jibx.runtime.impl.UnmarshallingContext.parsePastCurrentEndTag(UnmarshallingContext.java:800)
    at net.sf.hajdbc.sql.DriverDatabaseCluster.JiBX_binding_driver_unmarshal_2_0(DriverDatabaseCluster.java)
    at net.sf.hajdbc.sql.JiBX_binding_driverDriverDatabaseCluster_access.unmarshal()
    at org.jibx.runtime.impl.UnmarshallingContext.unmarshalElement(UnmarshallingContext.java:2773)
    at net.sf.hajdbc.sql.AbstractDatabaseCluster.preRegister(AbstractDatabaseCluster.java:1045)
    at com.sun.jmx.mbeanserver.MBeanSupport.preRegister(MBeanSupport.java:176)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.preRegisterInvoke(DefaultMBeanServerInterceptor.java:1010)
    ... 54 more

    (в примере в конфиге была настройка на xa-datasource)
    Обновление до 1.2.2 jibx не поможет, перекомпиляция ha-jdbc со свежей jibx не поможет, а вот что поможет, так это переписать конфиг на другой тип инициализации, то есть впихивать не xa-datasource, а database, так как имеем баг в размапливанием ресурсов (и database, и xa-datasource, и ещё пару вариантов все имплементят AbstractDatabaseCluster, чего выбирает DriverDatabaseCluster загадка природы, разгадывать которую и лезть в код дальше не было никакого желания).

p.s.
Конфиги ha-jdbc при запуске внутри wso2 ищет почему-то не в $CARBON_HOME/repository/conf где лежат все конфиги, а в корне $CARBON_HOME/

No comments:

Post a Comment