Összetett JIRA adatbázis lekérdezések Hatékonyan és egyszerűen programozva Kicsák Ádám adam.kicsak@everit.biz
JIRA jelentősége az EverIT Kft.-nél Agilis fejlesztési módszer támogatása Time tracking Fejlesztők és menedzserek közötti kommunikáció Testreszabhatóság, bővíthetőség Remek támogatás az Atlassian felől A termék folyamatosan fejlődik
Motiváció saját plugin fejlesztésre Megoldás keresése kényelmes munkanapló készítésére Nem találtunk kielégítő plugint Igények kielégítése saját JIRA plugin formájában A belső fejlesztések publikálása az Atlassian Marketplacen Saját fejlesztések termékké váltak A JIRA plugin fejlesztés világában való elmélyülés JIRA pluginokban a bevált technológiák kipróbálása, mint pl. Querydsl
EverIT plugin-ok RESTful Worklog Query Timetracker Holidaychecker Fillchecker
Timetracker Könnyen átlátható munkanapló, és jelentések
Felmerült problémák plugin fejlesztés közben A beépített eszközökkel nem sikerült kellő hatékonysággal adatokat lekérni A lekérdezések nehezen átláthatóak Nézetek és feltételek külön helyen Natív SQL parancs összeállítása kézzel Nagy mennyiségű adatoknál jelentősen lassulnak Megoldást kell találni hatékony lekérdezésre
Querydsl jelentősége Régebben JPA vagy natív lekérdezések voltak használatban JPA robosztusabb, többet tud, de sok probléma adódott használata közben Natív kérések Adatbázis vendor-lock Jelenleg a Querydsl preferált keretrendszer Egyszerűen programozható Átlátható lekérdezések Csak lekérdezések, semmi magic gyors Sok adatbázist támogat
Querydsl jelentősége Miért fontos, hogy egy jó keretrendszer dolgozzon a háttérben? Gyors kiszolgálás Megfelelő felhasználói élmény Átlátható kód Hatékony munkaórák Ismert keretrendszer Könnyen csatlakozhat új fejlesztő Jó keretrendszer támogatás Hatékony bug javítás
JIRA plugin-ok és Querydsl Az igény a komolyabb JIRA jelentésekkel szemben, és a Querydsl használata során szerzett jó tapasztalatok alapján: Két út is lehetséges: Querydsl kipróbálása JIRA plugin-ban Atlassian Pocketknife Querydsl Saját Querydsl plugin komponens Querydsl bevezetésétől várt eredmény: Hatékony, és átlátható lekérdezések.
Querydsl példa lekérdezés /* Queries the worklogs this week. */ private static final class WorklogsThisWeekQuery implements QuerydslCallable<List<WorklogDTO>> { @Override public List<WorklogDTO> call(final Connection connection, final Configuration configuration) throws SQLException { QWorklog worklog = new QWorklog("wl"); Canledar from = getmidnightatfirstdayofweek(); Calendar to = getmidnightatfirstdayofnextweek(); } return new SQLQuery<WorklogDTO>(connection, configuration).select( Projections.fields(WorklogDTO.class, worklog.author, worklog.created, worklog.worklogbody)).from(worklog).where(worklog.created.between( new Timestamp(from.getTimeInMillis()), new Timestamp(to.getTimeInMillis()))).fetch(); [...] }
Benchmark körülmények Adatbázis 15 projekt Több ezer regisztrált issue Megközelítőleg 100E munkanapló bejegyzés Tesztgép JIRA és adatbázis kiszolgáló ugyanazon a gépen Intel Core i5, 4 mag, 8 szál 8GB memória SSD háttértár
Chart report benchmark
Table report benchmark
Worklog Query benchmark
Konklúzió Nagy mennyiségű adat lekérdezésekor elengedhetetlen, hogy a lekérdezések megfelelő mértékben optimalizáltak legyenek. A Querydsl keretrendszer SQL közeli, de adatbázis független lekérdezések létrehozására képes, melyek jól olvashatók, könnyen paraméterezhetőek. A Benchmark-ok igazolják, hogy a Querydsl használatával sikerült a JIRA pluginjeink lekérdezéseit nagy mértékben optimalizálni.
Köszönöm a figyelmet!