Zdravím,
řekněme, že mám databazí a v ní tabulku s nutričními hodnotami potravin: FoodsTable.
Uživatelé na frontendu často potravinami listují, když vyhledávají fulltextem. A řekněme že tento query spouštím jako parametrized query:
var pstmt = con.prepareStatement("SELECT * FROM FoodTable WHERE name like CONCAT( '%',?,'%')");
pstmt.setString(1, notes);
var rs = pstmt.executeQuery();
Databáze bude řekněme Postgres a celkový objem dat v tabulce FoodTable bude řekněme 50MB.
Tzn. otázka zní, má v takovém případě vůbec smysl uvažovat o nějaké In memory cache přímo v Javovské aplikaci, když už relační databáze na své straně umí cachovat? A jak to vlastně ta databáze cachuje, drží si výsledky toho query in-memory, nebo to funguje jinak?
PS: Např. SQLite cachovat umí, ale těžko to je In-Memory cachování, spíše si tu cache nějak zapisuje na disk do souboru.
V databázi je několik různých cache - třeba v Postgresu - máte sdílenou cache datových stránek, lokální type cache, lokální cache plánů předpřipravených dotazů. Postgres necacheuje výsledky dotazu - ale v share buffers má data, které potřeboval pro zpracování dotazu a opakovaně (pokud zůstanou v cache) už je nečte z file systému (kde je další cache).
Přístup do lokální cache je výrazně rychlejší než přístup do Postgresu nebo jakékoliv jiné SQL databáze(minimálně o řád, ale možná ještě o víc). Jakmile přistupujete k databázi, tak máte režii síťové vrstvy, parseru, executoru (i když používáte prepared statements). Navíc v relačních databázích je dost velká režie zajištění konzistence dat - proto se používají i inmemory databáze jako je redis, kde je sice síťová režie, ale nulová režie s konzistencí a malá režie s protokolem.
Pokud neřeším konzistenci dat, tak je lokální cache vždy výhra (pokud se mi data vejdou do RAM, a pokud budu mít zahřátou cache). Jakmile se začne řešit konzistence dat - tak použití lokální cache (zvlášť jsou data v cache delší dobu) tak je spíš problém - musíte řešit jak synchronizovat data, jak zamykat data (když máte víc aplikačních serverů), jak optimálně zahřát cache, kdy invalidovat cache, ...
V praxi se používá mix - některá data se dobře kešují lokálně, jiným je dobře v redisu - a zbytek se nechává v databázi a lokální cache se použije maximálně v rámci transakce. Hodně záleží na očekávané zátěži - i bez lokální cache a se správnými indexy může databáze vracet dotazy v řádech ms, což pro většinu aplikací bohatě stačí.
Jinak on ten přístup do RAMky také není nekonečně rychlý - pro trochu větší data se musí použít hash tabulky nebo stromy, a s tím je spojená nějaká režie (ať už CPU nebo RAM).