Настройване и използване на Apache Ignite като кеш от второ ниво на MyBatis (L2 кеш)
В тази статия ще говоря за това как да настроя apache ignite като второ ниво на кеша за MyBatis и ще видя записа в кеша в Apache Ignite.
Какво е Apache Ignite?Това е разпределена, високопроизводителна изчислителна платформа в паметта с ключови характеристики:- с разпределено съхранение на обекти Решетка с данни в паметта, реализация на JSR 107 (Jcache)
- разпределени изчисления в RAM
- с разпределени съобщения и система за събития
- с ускорител (In-memory accelerator) за Hadoop и Spark.
Защо 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 приложение + SoapUI | MacBook Pro | CPU: 4RAM: 16 GWJVM: Oracle JVM 1.7_45 |
№ | Име на заявка | Време за реакция (mc) |
1 | QUERY_1: SELECT * FROM all_objects t където t.OBJECT_TYPE='TABLE' и t.object_name='EMP'; |
660
378
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 кеша и заявката за базата данни не се получава.
Сега, след първото извикване на уеб метода, времето за реакция ще отнеме от 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 може да увеличи производителността на системите със сто в сравнение с подхода без използване на кеша.