Skip to end of metadata
Go to start of metadata

Fred Daoud ír blogjában arról, hogy összetett és bonyolult adatszerkezetek helyett használjunk HsqlDB-t, pusztán memóriában futó SQL szerverként. Példaképpen az alábbi táblázatot adja meg, amelyben csak annyit tárolunk: ki, melyik országban, milyen kategóriában mennyit költött.

PersonCountryCategoryAmount
PeterItalyFood200.00
PeterGreeceFood150.00
PeterGreeceGifts50.00
LoisItalyClothing650.00
LoisBelgiumFood250.00
ChrisSwitzerlandFood300.00
MegSwitzerlandClothing200.00
StewieAustraliaGifts500.00

Ezt a táblázatot le tudjuk tárolni több megoldással is, például készíthetünk rá egy osztályt, mint entitást és java.util.Vector tárolja a sorokat. Esetleg az oszlopokra készítünk entitást és valamilyen java.util.Map származékban tároljuk le a sorokat. Ha követjük Fred eszmefuttatását, és használunk generikus deklarációt, akkor a valami ilyesmi típusban tarthatjuk a táblázat egy sorát:

Java forrás
Map<Person<Country<Category<Amount>>>>

A példa feladata egyszerű: adjuk meg egy újabb táblázatban, hogy kategóriánként mennyi kiadás történt. Egyszerű? Végig kell mennünk a táblázaton, az egyes kategóriákat le kell tennünk egy újabb Map típusba, értékként pedig a kiadás oszlop megfelelő sorát hozzá kell adnunk. Miért ne használnánk SQL motort erre a feladatra? A HsqlDB képes csak memóriában futni:

Java forrás
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:aname", "sa", "");

S az így létrehozott kapcsolaton létrehozzuk a kívánt táblát, beleszórjuk az adatokat, majd kedvünk és lehetőségeink szerint kérdezünk le belőle. A program bezárása során a létrehozott struktúra - mivel memóriában létezett csak: elfelejtődik.

      
      
Page viewed times

7 Comments

  1. Auth Gábor AUTHOR

    Ezt kellene picit JPA-val megtámogatni... :)

    Milyen kis erőforrás-igényű JPA menedzserek vannak? Amit lehetne használni egyszerű kliens oldalon egyszerű GUI alkalmazással, mint például egy számlázó program?

  2. Érdekes lehet. Van valami jó kis leírás-tutorial a HsqlDB-hez? A hivatalos dokumentum egy kicsit száraz nekem.

    Amúgy most olyan web-alkalmazást írok, ahol kikötés a sok adat nagy sebességgel történő feldolgozása - csak read only. A probléma az, hogy 70-200 MB memóriát fogyaszt jelenleg, ha betöltöm az adatbázisból a rekordokat. És gyakran a mezők alapján gyorsan szűrve kell őket HTML-lé alakítanom. Van valami ötlet erre, hogy mit használjak, hogy gyors is legyen, de a memóriát se eméssze fel? A JCache nem jó, mert szinte minden lekérdezésnél a teljes adathalmazt végig kell pásztázni (szűrés+aggregálás), nem csak véletlenszerű elemeket kell elérni.

    1. Unknown User (frimen)

      70-200 MB memóriát fogyaszt jelenleg, ha betöltöm az adatbázisból a rekordokat.

      Miért kell egyáltalán betölteni az adatokat az adatbázisból?

  3. Anonymous

    http://h2database.com/
    A HSQL apja from scratch. Ígéretes, szerintem átláthatóbb, és gyorsabb is. Ajánlom nektek is.

    1. Auth Gábor AUTHOR

      Megnéztem... jónak tűnik, főleg a tranzakciókezelés okán (de mintha ezt tudná a HsqlDB is), de az adatbázis titkosítása nem rossz dolog, főleg beágyazott módban, ahol HsqlDB esetén bárki által olvasható állományt kapunk.

    2. Unknown User (frimen)

      Birom az olyan teszteket ami ennek az oldalán is kint van.. :)
      Cliens-server összehasonlítás egy "szálas" lekérdezésben?  Kicsit komolytalanok a fiuk..

      Itt egy másik összehasonlítás..
      www.garret.ru/~knizhnik/eoodbms.html
      Ha valaki tud még ilyet irja már be a url-t, mert én is épp "keresőben" vagyok.. olyat keresek amivel ki lehet váltani a java.util.Map-okat és nem sql alapú, mert azok lassúak.

      1. Anonymous

        A fórumban ígéri Thomas, hogy ír egy olyan test-case-t ami már multi! :D

        Amúgy nem nagy cucc kiprószálni egy gépen a két kütyüt! :D

#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))