Ujorm je odlehčený Java framework, který umožňuje čtení informací z (nejen) databáze pomocí typově bezpečných objektových dotazů. Framework pracuje s objekty typu key-value.
2010-01-04
Nová verze UJO Framework 0.92
Byla uvolněna další verze frameworku z řadou vylepšení i oprav. Podrobnější informace lze najít v oficiálním popisu změn.
2009-09-20
Využití UJO v Hibernate
Tento článek se zabývá využitím UJO objektů v prostředí ORM frameworku Hibernate. Jaký může být důvod nahradit klasické POJO objekty invazivnější alternativou? Výhodu vidím především v možnostech snadnějšího zpracování výsledků pomocí užitečného API a k tomu přijde vhod i jisté navýšení výkonu některých typů HQL dotazů.
Úvodem bych rád rozptýlil mýtus, že za UJO objekty je schovaná neprůhledná magie. UJO může být každý objekt, který implementuje interface Ujo se čtyřmi metodami. Existuje více implementací, ale nyní si popíšeme QuickUjo obsažený v UJO Frameworku 0.91, který se vyznačuje snadnou použitelností a velkou rychlostí čtení i zápisu ve srovnání s Java reflexí.
Jak ten QuickUjo tedy funguje, ptáte se? Uvnitř toho objektu je schovaný jediný atribut obsahující pole objektů s délkou odpovídající počtu atributů objektu. Protože pro přístup k hodnotám objektu slouží konstanty zvané UjoProperty, můžeme každé takové property přiřadit index ukazující na jednu buňku z tohoto pole. Pokud tedy máme instanci UJO + UjoProperty, tak můžeme snadno získat i hodnotu, o přetypování se pak postará implementace UjoProperty. Není to jednoduché?
Typický příklad kódu pro čtení hodnoty:
Zajímavé bude srovnání výkonu UJO a POJO objektů v prostředí ORM frameworku Hibernate, potřebujeme však znát, jak se ty UJO mapují. Můj kolega Tomáš Hampl, napsal elegantní řešení založené na implementaci rozhraní PropertyAccessor, které je nyní k dispozici v UJO Frameworku 0.91. Vlivem nedokonalosti Hibernate je třeba implementovat ještě odpovídající gettery, ty však Hibernate používá pouze při startu aplikace. Nic nám ovšem nebrání dopsat si také settery pro vlastní pohodlí a objekty používat jako běžné POJO. Ukázka hotové implementace UJO je tady.
Specifikace alternativního accessoru v HBM souboru vypadá takto:
Pokud se výdáte cestou anotací, použijte
a na místo fieldů anotujte gettery.
Podívejte se, jak dopadly benchmark testy:
Kompetentní výklad výsledků přenechám raději odborníkům na Hibernate v diskusi. Popis testovacího prostředí najdete tady. Zdrojový kód testu lze stáhnout na SourceForge.
Na závěr bych rád uvedl na pravou míru, že reálné navýšení rychlosti se projeví především u rychlých a dobře indexovaných SQL dotazů s přiměřenou mírou aplikační logiky. Pokud je odezva na SQL dotaz pomalá a nebo výsledek dotazu podléhá náročnému zpracování, úspora rychlosti se v kontextu ostatních událostí může vytratit.
Odkazy:
Úvodem bych rád rozptýlil mýtus, že za UJO objekty je schovaná neprůhledná magie. UJO může být každý objekt, který implementuje interface Ujo se čtyřmi metodami. Existuje více implementací, ale nyní si popíšeme QuickUjo obsažený v UJO Frameworku 0.91, který se vyznačuje snadnou použitelností a velkou rychlostí čtení i zápisu ve srovnání s Java reflexí.
Jak ten QuickUjo tedy funguje, ptáte se? Uvnitř toho objektu je schovaný jediný atribut obsahující pole objektů s délkou odpovídající počtu atributů objektu. Protože pro přístup k hodnotám objektu slouží konstanty zvané UjoProperty, můžeme každé takové property přiřadit index ukazující na jednu buňku z tohoto pole. Pokud tedy máme instanci UJO + UjoProperty, tak můžeme snadno získat i hodnotu, o přetypování se pak postará implementace UjoProperty. Není to jednoduché?
Typický příklad kódu pro čtení hodnoty:
String name = Person.NAME.getValue(person);
alternativní příklad použití rozšířené implementace QuickUjoMid:String name = person.get(Person.NAME);
Zajímavé bude srovnání výkonu UJO a POJO objektů v prostředí ORM frameworku Hibernate, potřebujeme však znát, jak se ty UJO mapují. Můj kolega Tomáš Hampl, napsal elegantní řešení založené na implementaci rozhraní PropertyAccessor, které je nyní k dispozici v UJO Frameworku 0.91. Vlivem nedokonalosti Hibernate je třeba implementovat ještě odpovídající gettery, ty však Hibernate používá pouze při startu aplikace. Nic nám ovšem nebrání dopsat si také settery pro vlastní pohodlí a objekty používat jako běžné POJO. Ukázka hotové implementace UJO je tady.
Specifikace alternativního accessoru v HBM souboru vypadá takto:
<hibernate-mapping
default-access = "org.ujoframework.hibernateSupport.UjoPropertyAccessor"
... >
default-access = "org.ujoframework.hibernateSupport.UjoPropertyAccessor"
... >
Pokud se výdáte cestou anotací, použijte
@org.hibernate.annotations.AccessType( "org.ujoframework.hibernateSupport.UjoPropertyAccessor" )
a na místo fieldů anotujte gettery.
Podívejte se, jak dopadly benchmark testy:
| Hibernate akce | POJO [sec] | UJO [sec] | Poměr |
| INSERT | 11,37 | 12,31 | 0,92 |
| SINGLE SELECT | 0,58 | 0,52 | 1,13 |
| EMPTY SELECTS | 152,53 | 94,30 | 1,62 |
| MULTI SELECT | 169,52 | 94,72 | 1,79 |
| UPDATE | 3,69 | 3,75 | 0,99 |
| DELETE | 210,14 | 140,27 | 1,50 |
Kompetentní výklad výsledků přenechám raději odborníkům na Hibernate v diskusi. Popis testovacího prostředí najdete tady. Zdrojový kód testu lze stáhnout na SourceForge.
Na závěr bych rád uvedl na pravou míru, že reálné navýšení rychlosti se projeví především u rychlých a dobře indexovaných SQL dotazů s přiměřenou mírou aplikační logiky. Pokud je odezva na SQL dotaz pomalá a nebo výsledek dotazu podléhá náročnému zpracování, úspora rychlosti se v kontextu ostatních událostí může vytratit.
Odkazy:
2009-08-31
Ujorm verze 0.90
Byla uvolněna stabilní verze ORM modulu UJO Framework 0.90. Hlavní změny od poslední beta-verze jsou:
Nová aktualizovaná prezentace ORM je dostupná v angličtině zde.
- další zrychlení dotazu typu SELECT
- změna pracovního názvu UJO-ORM na finální Ujorm
- podpora nových databází Oracle a Firebird
- zobecněné API
- oprava některých menších chyb
Nová aktualizovaná prezentace ORM je dostupná v angličtině zde.
2009-08-12
UJO-ORM: doplněné testy
Úvodem bych rád poděkoval všem za komentáře k minulému příspěvku i když je pravda, že někteří mě příliš nešetřili :). Srovnání s konkurencí je nezbytné, já jsem si pro tento účel dovolil vybrat Hibernate, neberte to, prosím, osobně.
Na základě vašich připomínek jsem doplnil test SINGLE SELECT, který čte velký počet DB řádků z jedné tabulky. Dále jsem doplnil test zvaný EMPTY SELECT pro opakované dotazování nad tabulkou s prázdným výsledkem. Žádný z uvedených testů nereprezentuje zpravidla chování reálného serverového řešení a bezpochyby ani ten původní test (MULTI SELECT) není optimální.
Výsledky naznačují, že úzkým hrdlem Hibernate může být parsování HQL dotazu. Připomínám, že případné zapnutí "Hibernate Query Cache" bude významné jen pro případ stejných parametrů dotazu.
Odkaz na aktualizované testy je zde.
Pavel
Na základě vašich připomínek jsem doplnil test SINGLE SELECT, který čte velký počet DB řádků z jedné tabulky. Dále jsem doplnil test zvaný EMPTY SELECT pro opakované dotazování nad tabulkou s prázdným výsledkem. Žádný z uvedených testů nereprezentuje zpravidla chování reálného serverového řešení a bezpochyby ani ten původní test (MULTI SELECT) není optimální.
| Akce | UJO-ORM | Hibernate |
|---|---|---|
| SINGLE SELECT | 0.500 sec | 0.833 sec |
| EMPTY SELECT | 1.305 sec | 155.066 sec |
| MULTI SELECT | 21.715 sec | 172.258 sec |
Výsledky naznačují, že úzkým hrdlem Hibernate může být parsování HQL dotazu. Připomínám, že případné zapnutí "Hibernate Query Cache" bude významné jen pro případ stejných parametrů dotazu.
Odkaz na aktualizované testy je zde.
Pavel
2009-07-26
Nové ORM 8x rychlejší než Hibernate
Dovoluji si představit Vám nový open source ORM framework pro jazyk Java s názvem UJO-ORM, který je postaven na architektuře UJO objektů. Nové ORM řešení vzniklo ve snaze usnadnit vývoj perzistentní vrstvy, nicméně výkonnostní testy ukazují, že dotazy typu SELECT jsou osmkrát rychlejší ve srovnání s Hibernate. Další zajímavé vlastnosti jsou například kontrola typu parametrů v dotazu, malé paměťové nároky a miminální velikost celého řešení.
Úvodní prezentace je zde:
http://ujoframework.org/prezentace/
Výsledky benchmark testů jsou v následující tabulce, podrobnosti o testování najdete v prezentaci:
ORM home page:
http://ujoframework.org/orm/
Odkaz na zdrojový kód testů je zde:
https://sourceforge.net/projects/ujoframework/files/
Oficiální představení ORM modulu je plánováno na září 2009, nicméně už teď uvítám všechny Vaše podněty a připomínky. V případě zájmu o spolupráci kontaktujte autora na adrese: ujoframework(zavináč)gmail.com .
Pavel
Úvodní prezentace je zde:
http://ujoframework.org/prezentace/
Výsledky benchmark testů jsou v následující tabulce, podrobnosti o testování najdete v prezentaci:
| Akce | UJO-ORM | Hibernate |
|---|---|---|
| META-DATA | 0.282 | 1.562 |
| INSERT | 10.140 | 11.407 |
| SELECT | 22.016 | 175.234 |
| DELETE | 64.625 | 206.813 |
ORM home page:
http://ujoframework.org/orm/
Odkaz na zdrojový kód testů je zde:
https://sourceforge.net/projects/ujoframework/files/
Oficiální představení ORM modulu je plánováno na září 2009, nicméně už teď uvítám všechny Vaše podněty a připomínky. V případě zájmu o spolupráci kontaktujte autora na adrese: ujoframework(zavináč)gmail.com .
Pavel
2008-09-08
UJO Framework verze 0.80
Dne 7.9.2008 byla uvolněna zásadně rozšířená verze UJO Framework 0.80, novinky jsou zejména:
- nové rozhraní UjoExt pro lepší komfort vývojářů umožňující například řetěžení properties a setterů
- optimalizovaná deserializace UJO objektů, která je nyní rychlejší jak JAXB 2.1
- zjednodušení některých původních metod například pomocí rozhraní UjoAction
- snadno dostupná introspekce objektu bez nutnosti imlementovat PropertyDescriptor
- možnost předávání properties UJO objektu (nikoli hodnot) pomocí kolekce (či pole)
- jádro objektu stojí na dvou rozhraních, která umožňují snadnou implementaci
Uvedené vlastnosti otevírají nové možnosti využití v oblasti J2EE při tvorbě především generických operací nad objekty.
Framework obsahuje vedle vlastní specifikace UJO objektů také několik nástrojů pro jejich využití.
Pokud vás informace zaujaly, doporučuji shlédnout krátkou motivační prezentaci:
Další informace najdete na domovské stránce projektu, k dispozici je i referenční aplikace jWorkSheet
pro měření času na projektech, která důsledně využívá architekturu UJO objektů pro všechny perzistentní objekty.
Vítám všechny ohlasy i připomínky.
2008-05-13
UJO Framework 0.74
O víkendu byla uvolněna nová verze, novinky jsou následující:
- rychlost XML perzistence je 5x vyšší ve srovnání s perzistencí implementovanou v JRE 6.0
- podpora CSV perzistence
- nová implementace rozhraní Ujo pro lepší využití v objektech JavaBeans.
2008-04-14
Potřebujete rychlou XML perzistenci ?
Na poslední verzi UJO Frameworku (0.73) jsem provedl rychlostní testy zápisu do formátu XML včetně zpětného obnovení objektů. Výsledky jsou velice příznivé zejména ve srovnání s rychlostí XML serializace (XMLEncoder, XMLDecoder) implementované v JRE 6.0.
Tabulka výsledků:
Prostředí: Windows XP, procesor Intel DuoCore 1.66 MHz, JRE 1.6.0_04.
Popis testu:
Závěr: XML perzistence implementovaná v UJO Frameworku je přibližně třikrát rychlejší ve srovnání s XML perzistencí implementovanou v JRE 6.0. Všechny připomínky vítám.
Tabulka výsledků:
| Implementace | Rychlost serializace [sec] | Rychlost deserializace [sec] | Poměr celkem [%] |
|---|---|---|---|
| MapUjo | 1,352 | 0,563 | 32,5 |
| ArrayUjo | 1,340 | 0,535 | 31,8 |
| JavaBean | 3,828 | 2,063 | 100 |
Prostředí: Windows XP, procesor Intel DuoCore 1.66 MHz, JRE 1.6.0_04.
Popis testu:
- všechny business objekty jsou stejného typu (v rámci jednoho testu) a jsou rekurzivně sestavené vždy maximálně do čtvrté úrovně
- každý business objekt obsahuje 11 atributů včetně jednoho relačního typu ArrayList
- celkový počet instancí business objektu 6000
- test byl proveden třídou XmlSpeedTest2 (druhý průchod) ze skupiny JUnit testů připojených k projektu
- zveřejněné výsledky jsou aritmetickým průměrem hodnot ze čtyř pokusů
Závěr: XML perzistence implementovaná v UJO Frameworku je přibližně třikrát rychlejší ve srovnání s XML perzistencí implementovanou v JRE 6.0. Všechny připomínky vítám.
UJO Framework verze 0.73.final
Dnes byla uvolněna další verze projektu UJO Framework, soubory jsou ke stažení na SourceForge, změny jsou následující:
- vybrané property UJO objektu lze exportovat do XML souboru jako atributy. Pro toto použití lze property označit například pomocí anotací
- ladění výkonu perzistence do XML
- doplnění a oprava dokumentace
Přihlásit se k odběru:
Příspěvky (Atom)