STARÁ DOBRÁ JAVA A PERSISTENCE S CACHÉ Technologie Jalapeño od InterSystems Andreas Dieckow, Principal Product Manager, Strategic Planning InterSystems Corporation
Úvod Programovací jazyk Java má díky své vlastnosti „napiš to jednou a pak implementuj kamkoli“ mnoho příznivců a uživatelů. Avšak Java je objektově orientovaný jazyk, jehož datové objekty nejsou persistentní. I největší příznivci Javy připustí, že s objektově-relačním mapováním, nutným pro uchovávání javovských objektů v relační databázi, je spousta nezáživné práce. Podle některých odhadů to může zabrat až 60-70 % z celkového úsilí vývojářů. Caché od společnosti InterSystems, stejně jako jiné relační databáze, vždy podporovala JDBC. Ale navíc také nabízela javovským aplikacím objektově-orientovanou persistenci dat. Pro Caché třídy mohou být vytvořeny projekce typu Java proxy tříd nebo Enterprise Java Beans s vysoce výkonnou persistencí, jež je řízena samotnými beany. Tento přístup eliminuje objektově-relační mapování a současně po vývojářích v Javě vyžaduje vytváření datových (tedy persistentních) objektů v Caché ještě před vytvořením projekcí a jejich následným používáním v javovském vývojovém prostředí. Tento článek představuje technologii Jalapeño, která umožňuje přístup spíše „Java-in“ než „Caché-out“ k aplikačnímu vývoji. Pojednává o tom, jak zajistit persistenci „starých dobrých javovských objektů” – známých jako „plain old Java objects“ (POJO) v Caché, popisuje výhody spojené s užíváním objektové technologie pro ukládání dat a uvádí přehled kroků nezbytných k tomu, aby aplikace vytvořená s technologií Jalapeño běžela nad relační databází.
Stará dobrá Java a persistence s Caché Co je technologie Jalapeño? Technologie Jalapeño (JAva Language PErsistence with NO mapping) od společnosti InterSystems umožňuje vývojářům v Javě definovat třídy objektů v jakémkoli oblíbeném javovském prostředí a persistentně je uchovávat v Caché. Bez objektově-relačního mapování a bez nutnosti učit se používat Caché Studio. Vysoce výkonné metody přístupu k datovým objektům, které Caché generuje automaticky, existují nezávisle na Java třídě. Vývojáři mohou pracovat s objekty POJO a nemusí se zajímat, jakým mechanizmem jsou data uchovávána.
Persistence Java objektů jako objektů umožňuje při eliminaci objektově-relačního mapování významně zkrátit dobu vývoje. Další výhodou je také lepší výkon, protože není potřeba rozkládat a sestavovat (jinými slovy serializovat či deserializovat) objekty při jejich ukládání i čtení. I když je výhodnější ukládat data jako objekty, najdou se případy, kdy je nutné dotazovat se databáze s použitím SQL buď v Java aplikaci nebo přes analytický a reportingový nástroj třetí strany. Prostřednictvím své Unifikované datové architektury (Unified Data Architecture) Caché automaticky vystavuje data jako relační tabulky. A opět bez mapování. Caché vyhovuje normě JDBC a SQL dotazy mohou sdílet v aplikaci stejné databázové připojení jako metody objektové persistence, jež používá technologie Jalapeño.
Použití technologie Jalapeño Vývojář v Javě musí učinit pouze dva kroky, aby zajistil persistenci objektů POJO v Caché. Prvním je vytvoření a zkompilování třídy Caché z definic POJO, druhým použití Jalapeño Object Manageru (dále česky „Správce Objektů“) v Java aplikaci.
Vytvoření Caché tříd Jalapeño nabízí utilitu Schema Builder, která automaticky vytváří a kompiluje persistentní třídy Caché založené na definicích javovských tříd. (Schema Builder je javovskou třídou zahrnutou v CacheDB.jar.) Vývojáři mohou ovlivňovat způsob, jakým Caché strukturuje objektový model, tím, že vloží „anotace” do svých definic POJO tříd. Anotace (zavedené v JDK 1.5) neovlivňují chování javovských tříd za běhu programu, pouze poskytují další metadata o požadovaném objektovém modelu Caché. Caché může například z anotace zjistit, že jedna třída dědí z jiné nebo že nad danou vlastností třídy by měl být vytvořen index. Příklady 1A a 1B ukazují jednoduchou definici javovské třídy a třídy Caché, která je z ní odvozena. Povšimněte si, že třída Caché je potomkem třídy poskytnuté společností InterSystems, nazvané %Library.Persistent, a že byl vytvořen index nad vlastností „Name”. Vývojáři v Javě se nemusí nikdy dívat na třídy Caché vytvořené Schema Builderem ani o nich uvažovat. Pomocí objektů POJO mohou programovat ve svém oblíbeném vývojovém prostředí. Při změně objektového modelu stačí znovu spustit Schema Builder a tyto změny se odrazí v odpovídajících persistentních třídách Caché.
Použití Správce Objektů V jiných propojovacích mechanismech Javy a Caché, například při vytváření projekcí Caché tříd jako proxy Java tříd, jsou persistentní metody (zděděné z %Library.Persistent) transformovány do Java „přístupových” metod. Každá Java třída obsahuje svoji vlastní množinu přístupových metod. Naproti tomu se objekty POJO při použití technologie Jalapeño nemění kvůli přístupovým metodám. Javovská aplikace používá místo toho element zvaný Správce Objektů, jenž navazuje
spojení s databází. Vytváří instance příslušných Caché tříd i přístupové metody, které také spouští. Správce Objektů je Java třída a InterSystems jej dodává jako součást knihovny tříd CacheDB.jar. Kroky které je potřeba pro jeho použití jsou důvěrně známé každému programátorovi v Javě:
■ Zahrňte CacheDB.jar do proměnné CLASSPATH v aplikaci. ■ Importujte balíček „pojo”. (V CacheDB.jar mohou být také další balíčky, které můžete chtít naimportovat.) ■ Vytvořte instanci třídy Object Manager. Příklad 2 (strana 4) ukazuje vytvoření instance Správce Objektů. Všimněte si, že Správce Objektů navazuje JDBC spojení s databázovým serverem. V Caché mohou objektový i JDBC databázový přístup sdílet stejné spojení. Tím pádem může Správce Objektů využívat vysoce výkonné persistentní metody, ale dotazy na data mohou být také prováděny s pomocí SQL.
Příklad 1A – Java třída import com.intersys.pojo.annotations.CacheClass; import com.intersys.pojo.annotations.Index; @CacheClass(name="Person",primaryKey="ID",sqlTableName="PERSON") @Index(description="Name Index on Person table",name="PersonIndexOne",propertyNames={"name"},sqlName="PersonIDX") public class Person { public String name; public String ssn; public String telephone; }
Příklad 1B – odpovídající vygenerovaná třída Caché Class User.Person Extends %Library.Persistent [ ClientName = Person, Not ProcedureBlock, SqlTableName = PERSON ] { Property name As %Library.String(JAVATYPE = "java.lang.String", MAXLEN = 4096); Property ssn As %Library.String(JAVATYPE = "java.lang.String", MAXLEN = 4096); Property telephone As %Library.String(JAVATYPE = "java.lang.String", MAXLEN = 4096); Index PersonIndexOne On name [ SqlName = PersonIDX ]; XData JavaBlock {
<JavaBlock><Package implementation="CacheRefactor.cache" pojo="CacheRefactor"><UseSameNames>false
false< EagerFetchRequired>true }
Příklad 2 – instanciace třídy Správce Objektů public DBService (String[] args) throws Exception { String host = "localhost"; String username="_System"; // null for default String password="sys"; // null for default for (int i = 0; i < args.length; i++) if (args[i].equals("-user")) username = args[++i]; else if (args[i].equals("-password")) password = args[++i]; else if (args[i].equals("-host")) host = args[++i]; String url="jdbc:Cache://" + host + ":1972/USER"; Class.forName ("com.intersys.jdbc.CacheDriver"); Connection connection = DriverManager.getConnection (url, username, password); objectManager = ApplicationContext.createObjectManager (connection); }
Implementace nad relační databází Schopnost Správce Objektů ovládat přístup jak k objektovým, tak i k relačním datům nabývá na důležitosti, jestliže Java aplikace vytvořená pomocí technologie Jalapeño vyžaduje implementaci nad relační databází místo nad Caché. Nasazení v relační architektuře je velmi jednoduché a vyžaduje jen dva dodatečné kroky. Nejprve musí být vytvořeno příslušné schéma relační databáze. Caché pro tento případ nabízí exportní utilitu (jako součást CacheDB.jar), jež může vytvořit projekci objektového modelu jako DDL souborů a tu naimportovat do relační databáze. Projekce objektového modelu vznikne odvozením z definic tříd POJO. Nejedná se o stejnou věc jako v případě standardních relačních projekcí Caché, protože objektové schéma v Caché bylo vytvořeno z definic Java tříd. Exportní utilita „zná” pár věcí o objektech POJO a používá tyto informace při vytváření schématu relačních dat.
Jakmile bylo příslušné relační databázové schéma vytvořeno, stačí jen nakonfigurovat Správce Objektů tak, aby se připojoval k relační databázi namísto Caché. Správce Objektů automaticky použije metody objektové persistence (Open, Save, New, Delete) při připojování ke Caché a metody relační persistence (Select, Update, Insert, Delete) při připojování k relační databázi. Ačkoliv technologie Jalapeño od společnosti InterSystems usnadňuje nasazení javovských aplikací v relačním prostředí, vývojáři velmi rychle zjistí, že aplikace běží rychleji s Caché. Caché totiž nejen že umožňuje vysoce výkonnou objektovou persistenci, ale bylo také dokázáno, že odpovídá na SQL dotazy rychleji než relační databáze – a to zvláště na ty složité.
Závěr Caché dlouhou dobu podporovala různé způsoby datové persistence v Java aplikacích - přes JDCB nebo přístup k objektovým datům. A dosud byly tyto postupy "Caché-centrické". Vývojáři byli pověřeni definováním objektů v Caché a vytvořením jejich projekcí v prostředí Java. Nová technologie Jalapeño dává vývojářům možnost dosáhnout datové persistence pomocí postupu "Java-in". Persistentní Caché třídy mohou být definovány a kompilovány z definic tříd POJO. Za běhu programu jsou databázové připojení i persistence řízeny Správcem Objektů, jenž je součástí Jalapeña. Vývojáři mohou použít původní objekty POJO bez přemýšlení o tom, jak je persistence v databázi zajištěna. Také nemusí používat Caché studio a jsou osvobozeni od únavného a časově náročného objektově-relačního mapování. Caché umožňuje jedním spojením přístup k datům jak objektově tak i relačně a proto vývojáři mohou uvažovat v pojmech objektů. Javovské aplikace mohou využít vysoce výkonné metody objektově-orientované persistence a dotazovat Caché databázi pomocí SQL. Technologie Jalapeño neomezuje implementaci aplikací pouze nad Caché. S menšími úpravami může javovská aplikace vytvořená technologií Jalapeño běžet i nad relačními databázemi, avšak výsledný výkon nebude tak dobrý.