Настройване и използване на Apache Ignite като кеш от второ ниво на MyBatis (L2 кеш)

В тази статия ще говоря за това как да настроя apache ignite като второ ниво на кеша за MyBatis и ще видя записа в кеша в Apache Ignite.

използване
Какво е Apache Ignite?Това е разпределена, високопроизводителна изчислителна платформа в паметта с ключови характеристики:

  • с разпределено съхранение на обекти Решетка с данни в паметта, реализация на JSR 107 (Jcache)
  • разпределени изчисления в RAM
  • с разпределени съобщения и система за събития
  • с ускорител (In-memory accelerator) за Hadoop и Spark.
Защо Apache Ignite?Използвахме EhCache и Oracle Coherence дълго време, преди да преминем към HazelCast поради лесната му употреба. В последните версии HazelCast забави производителността във версията с отворен код и ние също се интересувахме от използването му като единна платформа за spark и Hadoop.

Защо MyBatis?Изборът между Hibernate и MyBatis е като да избирате между марките BMW и Mercedes. Поддръжката за Native SQL и местоположението на SQL скриптовете на едно място (а не разпръснати във всички изходни кодове) са много важни за нас, така че да е удобно да оптимизираме SQL заявките.

Apache Ignite наскоро обяви поддръжка за MyBatis като кеш от второ ниво и решихме да тестваме неговата функционалност и производителност. Всички операции с бази данни са скъпи, така че една от основните задачи за увеличаване на производителността на системите е да се намали броят на достъпите до базата данни: т.е. използвай кеша. Времето за отговор на заявката може да се изчисли с помощта на проста формула:

tacq – време за установяване на връзка treq – време на изпращане на заявка към базата данни texec – време за изпълнение на заявка в базата данни tres – време на получаване на отговор от базата данни

За добре оптимизирана заявка минималното време за отговор е между 20ms и 150ms.

Технически MyBatis поддържа 2 кеш нива по подразбиране:

  • кеширане в локалната сесия Локален кеш (активиран по подразбиране)
  • Кеш памет от 2-ро ниво

настройване

По подразбиране MyBatis използва само кеширане от първо ниво (L1 Cache), тоест обектите, кеширани в една сесия, не са достъпни за друга. Въпреки това може да се използва и глобалното 2-ро ниво: в него кешираните обекти ще бъдат достъпни за всички сесии. Това обикновено подобрява производителността, тъй като всяка нова сесия използва данни от L2 кеша.

Кешът от 2-ро ниво на MyBatis съхранява данни или информация за обекти (данни за обект), а не собствен обект, както при хибернация. Данните в кеша се съхраняват в 'Serialized' формат - хеш таблица, където ключът е идентификаторът на обекта, а стойностите са списък от стойности на параметри.

В примера по-долу ще видите кеша за запис в apache ignite за кеш от 2-ро ниво на MyBatis.

кеш ключ:[ и t.object_name=?, ПОТРЕБИТЕЛИ, SqlSessionFactoryBean]]Клас на стойността:java.util.ArrayListКеш стойност:[UserObject [ >

В нашия случай ключът е SQL заявката "SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE' and t.object_name=?"

Като пример взех системната таблица „all_objects“ от СУБД на Oracle и следните заявки:

Спецификации на SandBox:

Apache запалва клъстер2 виртуални машини (VM Ware)CPU: 2RAM: 4 GWJava HEAP: 2 GWОС: Red Hat SantigoJVM: Oracle JVM 1.7_45
Oracle 12cвиртуална машина (VM Ware)CPU: 4RAM: 8GWOS: Red Hat Santigo
Самостоятелно java приложение + SoapUIMacBook ProCPU: 4RAM: 16 GWJVM: Oracle JVM 1.7_45
Ако изпълните горните SQL заявки (QUERY1-3) чрез SQL Developer, ще получим следното време за отговор:
Име на заявкаВреме за реакция (mc)
1QUERY_1: SELECT * FROM all_objects t където t.OBJECT_TYPE='TABLE' и t.object_name='EMP';

6602QUERY_2: SELECT * FROM all_objects t where t.OBJECT_TYPE='TABLE';

3783QUERY_3: SELECT count(*) FROM all_objects;

700 Сега нека добавим apache ignite като кеш от ниво 2 и да видим резултата. Можете да намерите инструкции за инсталиране на apache ignite в моя блог и всички изходни кодове в github.

Добавете библиотеката mybatis-ignite към проекта Maven:

Добавете MyBatis sql mapper

Ето ни и нас:

  • насочете кеш адаптер към IgniteCacheAdapter
  • за всяка SQL заявка посочваме useCache="true", т.е. активираме режима на кеширане.
Добавете конфигурация на запалващата пружина

Обърнете специално внимание на настройването на „clientMode“ на false. Позволява ви да свържете cacheMode = Partitioned, където използваме разделен (разделен) кеш за споделяне на данни между кеширащи възли. Друг възможен вариант е да активирате репликирания режим, с помощта на който данните се репликират между всички кеширащи възли.

statisticsEnabled = true, ви позволява да получите статистика за използването на кеша: брой посещения и т.н.

writeSynchronizationMode=FULL_SYNC позволява кешираните данни да бъдат напълно синхронизирани с резервни възли.

Добавете съответния Java интерфейс:

Както и обикновен сапунен сервиз

След успешна компилация на проекта, ако извикаме уеб метода „getAllObjectsTypeCntByGroup“, тогава чрез SoapUi времето за отговор ще се увеличи до

1600ms в моя случай.

като

От втория път времето за отговор трябва да намалее значително, тъй като резултатът се връща от apache ignite кеша и заявката за базата данни не се получава.

apache

Сега, след първото извикване на уеб метода, времето за реакция ще отнеме от 5-6 ms.

В apache ignite записът в кеша ще изглежда така:

кеш ключ:[ >Клас на стойността:java.util.ArrayListСтойност на кеша:[UobjectGroupBy [ >

като

Въпреки че нашите бенчмаркове не са добър показател за изчисляване на производителността (не използвахме пула за връзки и не оптимизирахме SQL заявките), те все пак помагат да се изчисли увеличението на производителността, като се използва обичайната формула:

Печалба на производителност = Uncache Response Time/Cache Response Time = 1589/6, което е около 265 пъти по-бързо или Performance Gain = ((Cache Response Time - Cache Response Time)/Cache Response Time * 100) приблизително 26,383% по-бързо.

По този начин кешът L2 може да увеличи производителността на системите със сто в сравнение с подхода без използване на кеша.