Programovanie

Open source projekty Java: Java Caching System

Steve Haines, špecialista na podnikovú Java, sa tento mesiac pripojil k sérii projektov s otvoreným zdrojovým kódom Java zavedením systému Java Caching System (JCS), robustného riešenia ukladania do pamäte cache na podnikovej úrovni. Steve začína krátkym úvodom do ukladania do pamäte cache, diskusiou o kritériách na určenie, či sa majú objekty ukladať do medzipamäte, a o tom, či by vaša aplikácia mohla mať prospech z pamäte cache. Potom vám ukáže, ako nakonfigurovať JCS a použiť ho na zostavenie aplikácie ukladania do pamäte cache.

Systém Java Caching System (JCS) je robustný produkt ukladania do medzipamäte otvoreného zdroja vydaný prostredníctvom podprojektu Apache Jakarta. Poskytuje štandardné funkcie, ktoré by ste od systému cache očakávali, ako napríklad ukladanie do pamäte cache a algoritmy na selektívne odstraňovanie objektov z pamäte cache. Ponúka tiež pokročilejšie funkcie, ako napríklad ukladanie indexovaných diskov do vyrovnávacej pamäte a podpora distribuovaných kešiek.

Vyrovnávacia pamäť JCS má štruktúru podobnú mape, v ktorej sú dáta ukladané do vyrovnávacej pamäte ako pár mien-hodnota. JCS rozdeľuje medzipamäť na regiónoch. Každý región má svoju vlastnú konfiguráciu, ako aj svoju vlastnú sadu párov mien-hodnota. Každý región môže:

  • Majte inú veľkosť
  • Implementujte sa inak
  • Obsahujú rôzne údaje

The kľúče (názvy v pároch názov-hodnota) v jednej oblasti môžu byť rovnaké ako kľúče v iných oblastiach. Je to dôležité, pretože vám to umožňuje udržiavať samostatné cache pre rôzne objekty, všetky v rámci toho istého JVM - a všetky sú definované v jednom súbore vlastností.

Open source licencie

Každý z otvorených zdrojov Java, ktoré sú predmetom tejto série, podlieha licencii, ktorú by ste mali pochopiť pred integráciou projektu do svojich vlastných projektov. Na spoločnosť JCS sa vzťahuje licencia Apache; Ďalšie informácie nájdete v zdrojoch.

Tento článok skúma JCS tak, že vám najskôr ukáže, ako získať a nainštalovať aktuálne vydanie. Potom vysvetlím, čo je to cache, prečo by ste ju mohli používať a či je alebo nie je správnym riešením pre konkrétnu aplikáciu. Ďalej sa ponoríte do súboru vlastností JCS, ktorý je najlepšou cestou k porozumeniu JCS. Na záver zostavíte ukážkovú aplikáciu na ukladanie do pamäte cache, ktorá používa JCS.

Začnite s JCS

JCS si môžete stiahnuť zo stránky na stiahnutie na webovej stránke projektu JCS. V čase písania tohto článku je najnovšia verzia 1.3. Stiahnite si binárnu distribúciu (buď ako súbor TAR v systémoch Unix, alebo ako súbor ZIP v systéme Windows) a dekomprimujte ju do lokálneho adresára v počítači.

Koreňový adresár inštalačného adresára obsahuje jcs-1.3.jar, ktoré musíte pridať do svojho CLASSPATH pred kompiláciou a spustením aplikácií JCS.

Triedna dokumentácia zlatá baňa

V celom tomto článku, ako aj vo vašich vlastných nezávislých štúdiách zistíte, že JCS doc adresár je neoceniteľným zdrojom informácií o JCS vrátane dokumentácie API. Robustný dokument Javadoc je vaším oprávnením na pochopenie toho, ako používať triedy JCS.

Budete potrebovať dve závislosti:

  • Commons Logging
  • Súbežne

V časti Commons Logging pridajte commons-logging.jar tvojmu CLASSPATH.

Rýchlo sa ukladajúci základný náter

Vyrovnávacia pamäť je určená na uchovávanie objektov, zvyčajne v pamäti, na okamžitý prístup k aplikácii. Aplikácia interaguje odlišne s vyrovnávacou pamäťou od spôsobu, akým interaguje s riešeniami externého úložiska. Aplikácia zvyčajne získa pripojenie k databáze, vykoná dotaz v sieti a analyzuje výsledky pri ich vrátení. Vyrovnávacia pamäť udržuje zbierku ľahko dostupných objektov v robustnej štruktúre podobnej mape, ktorá nevyžaduje sieťové volanie. Výkon aplikácií Enterprise Java sa exponenciálne zvyšuje, keď pristupuje k opakovane použiteľným objektom v pamäti cache po ich načítaní z databázy, a nie uskutočňovať vzdialené volania z databázy.

Ak má vaša aplikácia zvládnuteľný počet objektov, ktoré sú často prístupné, potom môže vyrovnávacia pamäť pravdepodobne zvýšiť jej výkon. Aplikácie Java sú obmedzené dostupnými prostriedkami v JVM, z ktorých najvzácnejšia je pamäť. Nemá zmysel odoberať pamäť JVM, aby držalo objekty, ku ktorým málokedy prístup. Pravdepodobne je lepšie načítať objekt, ku ktorému sa pristupuje, raz za niekoľko hodín podľa potreby a ponechať dostatok voľnej pamäte pre ďalšie zdroje. Na druhej strane je lepšie načítať objekty, ku ktorým sa pristupuje niekoľkokrát za minútu - alebo dokonca niekoľkokrát za hodinu - do vyrovnávacej pamäte a slúžiť im z pamäte, a nie uskutočňovať vzdialené volania zakaždým, keď je objekt potrebný. Ak je počet objektov, ku ktorým vaša aplikácia často pristupuje, spravovateľný v rámci dostupnej pamäte, je to dobrý kandidát na ukladanie do pamäte cache. Ale ak to pristupuje milióny častých objektov, potom by mohlo byť v najlepšom záujme aplikácie načítať objekty podľa potreby, namiesto použitia 75 percent haldy JVM na hostenie medzipamäte.

Ukladanie do medzipamäte verzus združovanie

V diskusiách o ukladaní do pamäte cache často panuje zmätok v rozlišovaní medzi cache a poolom. Ktoré objekty by sa mali ukladať do medzipamäte a ktoré objekty by sa mali zhromažďovať? Odpoveď spočíva v povahe samotných objektov. Ak si objekt zachováva stav, mal by sa uložiť do medzipamäte. Objekty bez štátnej príslušnosti by sa mali zhromažďovať. Analogicky zvážte dve činnosti: nákup potravín v supermarkete a vyzdvihnutie dieťaťa v škole. Každý pokladník si môže v supermarkete pozrieť ktoréhokoľvek zákazníka; nezáleží na tom, ktorý pokladník dostanete, takže by sa mali zhromažďovať. Keď vyzdvihnete svoje dieťa zo školy, chcete tvoj dieťa, nie cudzie, preto by deti mali byť v cache.

Pri extrapolácii tohto nápadu na podnikovú Javu by sa mali zhromaždiť prostriedky, ako sú databázové pripojenia a fazuľa na spracovanie podniku, zatiaľ čo objekty, ako sú zamestnanci, dokumenty a widgety, by sa mali ukladať do pamäte cache. Nezáleží na tom, ktoré databázové pripojenie získa vaša aplikácia z fondu pripojení - všetci robia to isté - ale ak si chcete zvýšiť plat, je dôležité, aby ste získali tvoj objekt zamestnanca.

Pochopenie regiónov JCS

Používanie JCS je v skutočnosti celkom jednoduché, potrebujete však základné znalosti o tom, ako JCS definuje oblasti medzipamäte a ako ich možno nakonfigurovať. Súbor vlastností JCS je logickým miestom, kde môžete začať rozumieť JCS. Výpis 1 zobrazuje ukážkový súbor vlastností JCS.

Zoznam 1. Súbor vlastností JCS (cache.ccf)

# DEFAULT CACHE REGION jcs.default = DC jcs.default.cacheattributes = org.apache.jcs.engine.CompositeCacheAttributes jcs.default.cacheattributes.MaxObjects = 1000 jcs.default.cacheattributes.MemoryCacheName = org.apache.jcs.engine.memory.memory .lru.LRUMemoryCache jcs.default.cacheattributes.UseMemoryShrinker = true jcs.default.cacheattributes.MaxMemoryIdleTimeSeconds = 3600 jcs.default.cacheattributes.ShrinkerIntervalSeconds = 60 jcs.default.element.ache.cement.ache.lement.jache.lement.ache.lement.jase.cement.ache.lement.jase.cement.ache.lement.jase.cemente. elementattributes.IsEternal = false jcs.default.elementattributes.MaxLifeSeconds = 21600 jcs.default.elementattributes.IdleTime = 1800 jcs.default.elementattributes.IsSpool = true jcs.default.elementattributes.IsRemote = true jcs.default.elementattributes.IsLateral = true # PREDEFINOVANÉ KRAJOVÉ REGIÓNY jcs.region.musicCache = DC jcs.region.musicCache.cacheattributes = org.apache.jcs.engine.CompositeCacheAttributes jcs.region.musicCache.cacheattributes.MaxObjects = 1000 jcs.region.musicCache.cacheattcacheatcams.cacheattcamseat ame = org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.region.musicCache.cacheattributes.UseMemoryShrinker = true jcs.region.musicCache.cacheattributy.MaxMemoryIdleTimeSeconds = 3600 jcs.region.musicCache.cater.musicCache.cater.musicCache.cater.seatter.musicCache.casseaton.musicCache.casseatre.musiccatche.casseatre.musiccatche.casseatre.musiccatche.casseatre.musiccatche.casseatre.musiccatche.casseatre.musiccache.casereattle.musicsetche.intext. region.musicCache.cacheattributes.MaxSpoolPerRun = 500 jcs.region.musicCache.elementattributes = org.apache.jcs.engine.ElementAttributes jcs.region.musicCache.elementattributes.IsEternal = false # K DISPOZÍCII POMOCNÉ CACHES jcs.auxiliary.DC = org. .jcs.aUX .attributes.MaxPurgatorySize = 10 000 000 jcs.auxiliary.DC.attributes.MaxKeySize = 10 000 000 jcs.auxiliary.DC.attributes.MaxRecycleBinSize = 5 000 jcs.auxiliary.DC.attributes.OptimizeAtRemoveCount = 300 000 jcs.auxiliary.DC.attributes = 60

Zoznam 1 obsahuje tri časti:

  • Predvolená oblasť definuje predvolenú konfiguráciu pre všetky oblasti, pokiaľ nie je explicitne prepísaná niektorou z ďalších oblastí.
  • Ďalej je uvedený zoznam preddefinovaných (tj. Užívateľom definovaných) oblastí pamäte cache, ktoré v tomto prípade zahŕňajú musicCache ktoré použijem v nasledujúcom príklade.
  • Pomocné keše definujú pomocné látky ktoré je možné zapojiť do oblasti pamäte cache. Hoci každá oblasť medzipamäte musí mať jednu (a iba jednu) pomocnú pamäť, môže obsahovať ľubovoľný počet ďalších pomocných zariadení, ktoré môžu obsahovať údaje v pamäti. V tomto príklade vytvorím indexovanú medzipamäť disku, ale môžete ju tiež definovať bočný a diaľkový pomocné látky. Bočný pomocník môže replikovať vaše dáta z medzipamäte do iných cache pomocou zásuvky TCP alebo protokolu JGroups. Vzdialený pomocný program môže replikovať údaje do iných keší cez Remote Method Invocation (RMI).

Každý región môže definovať atribúty medzipamäte ako aj atribúty prvkov. Atribút medzipamäte definuje možnosť konfigurácie pre medzipamäť, zatiaľ čo atribút prvku definuje možnosť konfigurácie pre prvky v medzipamäti. Tu je súhrn možností atribútov pamäte cache:

  • MaxObjects: Toto je maximálny povolený počet objektov v pamäti.
  • MemoryCacheName: Táto vlastnosť vám umožňuje definovať správcu pamäte, ktorý sa má použiť ako váš MemoryCache. Predvolený správca pamäte implementuje stratégiu LRU.
  • UseMemoryShrinker: Táto voľba umožňuje JCS periodicky iterovať cez medzipamäť a hľadať objekty, ktoré je možné odstrániť (položky, ktorých platnosť vypršala alebo prekročili maximálny čas nečinnosti pamäte). Predvolená hodnota je nepravdivé.
  • MaxMemoryIdleTimeSeconds: Ak je povolený zmenšovač pamäte, táto vlastnosť informuje JCS o tom, ako dlho môže zostať objekt nečinný, kým ho zmenšovač nevyberie (a založí ho na disk, ak bola vytvorená indexovaná vyrovnávacia pamäť disku). Predvolená hodnota je -1, ktorá túto možnosť zakáže.
  • ShrinkerIntervalSeconds: Ak je povolený zmenšovač pamäte, táto vlastnosť informuje JCS, ako často sa zmenšovač spúšťa. Predvolená hodnota je 60 sekúnd.
  • DiskUsagePattern: Ak je povolená disková vyrovnávacia pamäť, táto vlastnosť povie JCS, ako zachovať dáta, keď je vyrovnávacia pamäť plná. Predvolená hodnota je SWAP, ktorá zaraďuje položky na disk iba v prípade, že je vyrovnávacia pamäť plná. Ďalšou možnosťou je AKTUALIZÁCIA, ktorý zachová všetky údaje na disku, ale iba pri aktualizácii údajov. Ak bol pomocný program JDBC definovaný ako disková vyrovnávacia pamäť, všetky objekty zostanú v pamäti (kým nie je pamäť plná) a sú tiež uchované v databáze, ktorá zaisťuje dobrý výkon a spoľahlivosť.

A tu sú možnosti atribútu prvku:

  • IsEternal: Ak je prvok večný, potom ho nemožno odstrániť z medzipamäte, pretože presahuje svoju maximálnu životnosť. Táto možnosť je predvolene nastavená na pravda.
  • MaxLifeSeconds: Ak prvky nie sú večné, táto možnosť definuje maximálnu životnosť každého objektu pred odstránením. Ak je zmenšovač pamäte spustený, zmenšovateľ objekty odstráni; ak nie, po odstránení sa odstránia. Táto možnosť je predvolene nastavená na -1, ktorá zakáže túto možnosť.
  • IsSpool: Táto možnosť definuje, či je možné prvok zaradiť na disk. Predvolené je pravda.
  • IsLateral: Táto možnosť definuje, či je možné prvok poslať do bočnej vyrovnávacej pamäte. Predvolené je pravda.
  • IsRemote: Táto možnosť definuje, či je možné prvok odoslať do vzdialenej pamäte cache. Predvolené hodnoty pre pravda.

V zozname 1 som vytvoril oblasť s názvom musicCache ktorý pojme až 1 000 položiek v pamäti. Jeho správca pamäte používa algoritmus LRU: keď je vyrovnávacia pamäť plná a JCS potrebuje uvoľniť miesto pre nové položky, odstráni položky, ku ktorým sa v poslednej dobe nedostal prístup. Má povolený zmenšovač pamäte a zmenšovač sa spustí každých 60 sekúnd. Vyradí položky, ktoré sú nečinné dlhšie ako 60 minút (3 600 sekúnd.) Jej položky nie sú večné a je možné ich zapísať na disk, do bočnej vyrovnávacej pamäte alebo do vzdialenej pamäte cache.

Všimnite si, že IsSpool, IsLaterala IsRemote nastavenia sa dedia z predvolených nastavení. Pretože jcs.region.musicCache prvok je nastavený na DC, je definované nielen na udržiavanie medzipamäte v pamäti, ale aj na použitie indexovanej medzipamäte disku ako pomocného prostriedku. (Túto vlastnosť je možné nastaviť na zoznam viacerých pomocných zariadení oddelených čiarkami.) Vyrovnávacia pamäť disku je nakonfigurovaná na ukladanie položiek do c: / tepl adresár. (JCS uprednostňuje lomky pred spätnými lomkami.) Zvyšné atribúty konfigurujú diskovú vyrovnávaciu pamäť pomocou znaku IndexedDiskCacheAttribute predmet; o týchto atribútoch si môžete prečítať v JCS Javadoc.

Vytvorenie vzorky aplikácie na ukladanie do pamäte cache

Keď pochopíte, ako nakonfigurovať JCS, je vytvorenie aplikácie na ukladanie do vyrovnávacej pamäte jednoduché. Aplikácia musí byť schopná:

  • Inicializujte vyrovnávaciu pamäť z jej konfiguračného súboru
  • Prístup k oblasti v pamäti cache
  • Vložte objekty do vyrovnávacej pamäte
  • Načítajte objekty z medzipamäte
  • Odstráňte predmety z medzipamäte

Cache je možné inicializovať buď automaticky alebo manuálne. Ak pomenujete svoj konfiguračný súbor cache.ccf a vložte ho priamo do svojho CLASSPATH (napríklad váš koreňový adresár), potom pri prvom vyvolaní JCS vyhľadá súbor a vhodne sa inicializuje. Ak potrebujete uložiť svoj konfiguračný súbor inde alebo ho pomenovať inak, môžete použiť org.apache.jcs.utils.props.PropertyLoader's loadProperties () metóda na načítanie vlastností JCS z ľubovoľného súboru vlastností.

$config[zx-auto] not found$config[zx-overlay] not found