2009. április 19., vasárnap

Külső program hívása adatbázis-kezelőből

Oracle

Az Oracle adatbázis-kezelője elérhető programozói interfészeken keresztül, mint például C-ből az OCI (Oracle Call Interface) segítségével, Javaból JDBC API-n (Java Database Connectivity) keresztül, .NET környezetből ODP.NET felhasználásával, vagy más programnyelvek esetén ODBC (Oracle Database Connectitity) segítségével. Az Oracle fejlesztők törekednek arra, hogy a napjainkban használt, szinte összes programnyelvből elérhető legyen az adatbázis, szállítóként pedig nem tehetik meg, hogy ne szenteljenek ennek elegendő figyelmet. Az egyes programnyelvekhez készített programozói interfészeken (API) keresztül azonban csak kliens-szerver architektúrában képesek a programok kommunikálni az adatbázis-kezelővel, tehát minden esetben csak a kliens kezdeményezhet, a szerver passzív szerepet tölt be. Szerepcsere ezzel a technológiával nem lehetséges.

ODP.NET (pl. C#) használata esetén lehetőségünk van a Database Change Notification featuret kihasználni, aminek a segítségével azonnal értesülhetünk az adatbázisban bekövetkezett változásokról. Ehhez a kliens oldali alkalmazásnak folyamatos kapcsolatban kell lennie az adatbázissal, így tudja feldolgozni az onnan kapott üzeneteket.
http://download.oracle.com/docs/cd/B28359_01/win.111/b28375/featChange.htm#CJAGGGHA

Van lehetőség szerveroldalon, az Oracle példány címtartományán belül Java alkalmazás futtatására. Ezen lehetőség felhasználásával összetettebb üzleti logikát lehet megvalósítani adatbázisoldalon, ráadásul jelentős IPC (Inter Process Comunication) és hálózati overheadet spórolhatunk meg vele. További előnye a megoldásnak, hogy az alkalmazás indítását szerveroldalon kezdeményezhetjük, így tetszőleges adatbázis esemény hatására lefuttathatjuk, például triggerek segítségével. A hátránya azonban az, hogy csak a Java nyelven implementált programjaink használhatóak.

Létezik azonban egy univerzális megoldás arra a problémára, hogy adatbázis oldalon kezdeményezve tetszőleges programnyelven implementált alkalmazást lefuttathassunk. Az Oracle a fejlesztők rendelkezésére bocsát egy olyan technikát, amivel mindezt megvalósíthatják. Lehetőséget biztosít arra, hogy C (vagy Java) nyelven implementált eljárásokat PL/SQL eljárásként meghívhassunk. Ez a technika a külső eljárásnak (External Procedure) hívása, ami nem más, mint DLL (Dynamic Link Library) hívás PL/SQL kódból. Ha pedig van rá mód, hogy akármikor meghívjunk egy C függvényt, akkor minden olyan más programnyelven implementált kódot képesek vagyunk futtatni, ami futtatható az adott környezetben, vagy egy szkript segítségével működésre lehet bírni.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_externproc.htm#ADFNS1402

External procedure használata
Ahhoz, hogy egy C vagy Java nyelven implementált programot meghívhassunk Oracle környezetből, három feladatot kell helyesen megvalósítani: Load, Publish & Call.

Load
Először be kell tölteni a szükséges DLL-t vagy java osztályt, másképp nem tudjuk meghívni.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_externproc.htm#i1006311

Publish
Utána rögzíteni kell a meghívható függvények nevét, paraméterlistáját és a visszatérési érték típusát. Ezek után szinte ugyanúgy kezelhető, mint egy belső PL/SQL tárolt eljárás.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_externproc.htm#i1006405

Call
Nincs más hátra, mint a PL/SQL környezetből meghívni az így elérhetővé tett külső eljárásokat.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_externproc.htm#i1007572


Microsoft SQL Server

Ugyan úgy, mint az Oracle adatbázis, az SQL Server is elérhető különféle adatbáziskapcsolat-kezelő API-kon keresztül (például ODBC). Java nyelvből a JDBC API, C# esetén pedig az ADO.NET használható. Ezeken keresztül azonban csak a kliens kezdeményezheti a kapcsolatot.

A .NET CLR (Common Language Runtime) integrálva van az SQL Server-be, így könnyen lehet olyan menedzselt .NET kódot (pl. C#) írni, amit tárolt eljárásként (Managed (CLR) Stored Procedure) lehet közvetlenül hívni a szerveroldali T-SQL kódból. Ennek a technikának az alkalmazásával elérhetjük, hogy bonyolultabb üzleti logikát is bele lehessen csempészni a szerveroldali programozásba. Értem itt ezalatt, hogy az adatkezelést a T-SQL-re bízzuk, azonban az adatok feldolgozását .NET kóddal végezzük, így mindenki azt csinálhatja amire kitalálták. .NET-ből akár más, tetszőleges program hívható/indítható.
http://msdn.microsoft.com/en-us/library/ms131045.aspx

Az SQL Server lehetőséget ad arra, hogy Microsoft Visual C vagy C++ kódot lehessen hívni szerver oldalról (Extended Stored Procedure). Ehhez kódunkból az Opends60.lib fájllal linkelt DLL-t kell készíteni, majd a sp_addextendedproc T-SQL tárolt eljárással regisztrálni. Ezek után már ugyan úgy használható, mint egy belső tárolt eljárás. A kód annak a címtartományában fog futni, ahonnan meghívták. Kezelése nagyon hasonló az Oracle External Procedure-éhez.
http://support.microsoft.com/kb/190987

2009. április 15., szerda

HOUG '09

Véget ért az idei HOUG konferencia, melyen az elejétől a végéig részt vettem. Sajnálatosan az előadásom rajtam kívülálló okok miatt meghiúsult, azonban így is jól óreztem magam ez alatt a néhány nap alatt. Ezt nem csak a környezet alapozta meg, hanem a programok igényessége és szakmai változatossága is.
Azt hiszem a legnépszerűbb előadást Mocsai Lajos tartotta első nap, aki a sikeres vezetőről, és annak ismérveiről beszélt. Úgy gondolom a közönség nagyon évezte a beszédet, a tréner a végén vastapsot kapott.
Ezalatt a pár nap alatt sok ismerősöm tartott előadást, többek között Marton József Ernő (BME), Kocsis István (BME), Müller János (BME), Izsák Tamás (Független szakértő), Kardkovács Zsolt Tivadar (BME, U1 Kutató Központ), Sárecz Lajos (Oracle). Ha még engem is hozzávennénk a felsoroláshoz, akkor látható, hogy ezen a konferencián a Budapesti Műszaki és Gazdaságtudományi Egyetem (BME) egyre nagyobb számban képviselteti magát, ami az Oracle Hungary és az egyetem jó kapcsolatát mutatja. Misem bizonyítja ezt jobban, minthogy egy új, diákszekció is indult (Jövünk! címmel), ahol kizárólag diákok meséltek eddigi tapasztalataikról.
A szervezők gondoskodtak a szórakozásról is, minden este szponzorált programok voltak, melyek közül nekem a kedd esti GuitarHero tetszett a legjobban. Időt és energiát nem kímélve bandában zenélve szórakoztattuk magunkat és egymást (dobszekció rulez :D).
Az idei konferencia nagyon tetszett, rengeteg pozitív élménnyel és tapasztalattal tértem haza.