JDBC. A JDBC alkalmazása

Hasonló dokumentumok
JDBC Adatbáziskapcsolat objektumok SQL parancsok küldése Kötegelt módosítások ResultSet Tranzakciók DAO tervezési minta 1 / 45

Kapcsolat objektumok. Válasz feldolgozása Tranzakciók DAO tervezési minta

JDBC Adatbáziskapcsolat objektumok SQL parancsok küldése Kötegelt módosítások ResultSet Tranzakciók

Adatbázisok webalkalmazásokban


Java programozási nyelv 11. rész Adatbázis-programozás

B I T M A N B I v: T M A N

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

JDBC - adatbáziskezelés

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

B I T M A N B I v: T M A N

Java Database Connectivity (JDBC)

Java Programozás 10. Ea: JDBC. SQLite alapokon

Tranzakciókezelés PL/SQL-ben

ADATBÁZIS-KEZELÉS - BEVEZETŐ - Tarcsi Ádám, ade@inf.elte.hu

Témák. JDBC Adatbázisok JDBC használatának lépései Tranzakciók Adatbázis tervezés EK diagram

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Programozási technológia

Tranzakció-kezelés, alapfogalmak. Vassányi István, 2012.

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Adatbázis használat I. 5. gyakorlat

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Java és web programozás

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

A Java nyelv. VI. Adatbázis-kezelés Javaban, Példaprogram Az elôzô részben láthattuk, hogy a Java ideális programozási nyelv perszisztens objektumok

Enterprise JavaBeans 1.4 platform (EJB 2.0)

JavaServer Pages (JSP) (folytatás)

Célkitűzések Az Oracle10 g felépítésének, használatának alapszíntű megismerése

Adatbázis kezelés Delphiben. SQL lekérdezések

SZAKDOLGOZAT. Szabó Attila

Java és web programozás

MDAC - Microsoft Data Access Components

Database Systems II. ZH összefoglaló

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő A PHP programozási nyelv JDBC, ODBC

Adatbázis Rendszerek II. 7. Oracle JDBC

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

Az SQL*Plus használata

JAVA PROGRAMOZÁS 8.ELŐADÁS

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

Kliens oldali SQL-API

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

ANDROID ALKALMAZÁSFEJLESZTÉS

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Adatbázis használata PHP-ből

Bevezetés: az SQL-be

A Java EE 5 plattform

Adatbázisok I. Definíció: DDL: - objektum létrehozás CREATE - objektum megszüntetés DROP - objektum módosítás ALTER

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Adatbázisok-1 előadás Előadó: dr. Hajas Csilla

Oracle Containers for Java - j2ee alkalmazás szerver funkciók. Molnár Balázs Oracle Hungary

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 4.ELŐADÁS. Adatbázis alapú alkalmazások készítése PHP-ben

8. Gyakorlat SQL. DDL (Data Definition Language) adatdefiníciós nyelv utasításai:

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

B I T M A N B I v: T M A N

Adatbázisok biztonsága

Az indexelés újdonságai Oracle Database 12c R1 és 12c R2

A könyv tartalomjegyzéke

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

LBRA6i integrált rendszer

LOGISZTIKAI ADATBÁZIS RENDSZEREK BEVEZETÉS

Tartalomjegyzék. Tartalomjegyzék 1. Az SQL nyelv 1 Az SQL DDL alapjai 2

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

JNDI - alapok. Java Naming and Directory Interface

ORACLE. SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Megtanuljuk, hogyan lehet egy web-alkalmazással adatbázishoz csatlakozni Pontosan megnézzük a PHP lehetőségeit o MySQL-hez o Oracle-höz

Indexek és SQL hangolás

Adatbázisok* tulajdonságai

MySQL kontra MongoDB programozás. SQL és NoSQL megközelítés egy konkrét példán keresztül

Beszerzési logisztika támogatása az optimális beszállító kiválasztása révén

Adatbázis Rendszerek I. 10. SQL alapok (DML esettanulmány)

A WEB programozása - JSP1 dr.gál Tibor őszi félév

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

Szoftver Tervezési Dokumentáció. Nguyen Thai Binh

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

SQL. 1.rész. 1.elıadás // Adatbázisok-1 elıadás // Ullman-Widom (Stanford) tananyaga alapján // Hajas Csilla (ELTE IK) 1

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

A relációs adatbáziskezelés szabványos nyelve Két fő csoportba sorolhatók az utasításai

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

PHP-MySQL. Adatbázisok gyakorlat

SQL DDL-2 (aktív elemek) triggerek

API tervezése mobil környezetbe. gyakorlat

9.előadás: Adatbázisok-I. dr. Hajas Csilla (ELTE IK)

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

Adatbázisok gyakorlat

SQLServer. Particionálás

Tranzakciók az SQL-ben

5. téma XML DB. Az adatkezelés és XML kapcsolata. Miért fontos az XML használata az adatbázis kezelésben?

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A 1-1

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

JAVA webes alkalmazások

Vizuális programozás gyakorlat

Az Oracle rendszer komponensei

Átírás:

Áttekintés JDBC adatbázis-hozzáférés Java-ból Bevezetés Kapcsolat objektumok SQL parancs küldés Válasz feldolgozása Tranzakciók DAO tervezési minta 1 / 40 2 / 40 JDBC JDBC API: Java osztályokat és interfészeket tartalmazó csomagok (java.sql, javax.sql), melyek egy standard API-t biztosítanak adatbázist használó alkalmazások valamint adatbázis-keretrendszerek fejlesztésére. A JDBC API előnye abban áll, hogy elvileg bármilyen adatbázist elérhetünk vele bármilyen platformról, melyen a Java virtuális gép fut. Nem kell tehát minden adatbázisszerverre külön adatbázis hozzáférési réteget írni, hanem ugyanaz a kód működni fog bármely adatbázisszerverrel (feltéve, hogy nem használunk adatbázis-specifikus SQL kiterjesztéseket). A JDBC alkalmazása mire használható a JDBC: 1. Kapcsolat objektumok lekérése egy adatforrástól (data source) 2. Lekérdező (select) adat-módosító (insert, update, delete) valamint adatbázis struktúra módosító parancsokat lehet küldeni az adatbázisnak (azaz bármilyen érvényes SQL parancsot). 3. A lekérdezés eredményét fel lehet dolgozni JDBC meghajtó szolgáltatók, lásd: http://developers.sun.com/product/jdbc/drivers 3 / 40 4 / 40

Adatbáziskapcsolat objektumok (Connection) Pl. Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getconnection("mylogin", "mypassword"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select a, b, c FROM Table1"); while (rs.next()) { int x = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); } Egy Connection objektum egy adatbáziskapcsolatnak felel meg. Egy adatbáziskapcsolat lehetővé teszi SQL parancsok hívását, illetve az eredmények kinyerését a kapcsolat-objektumon keresztül. Egy alkalmazás használhat egy vagy több kapcsolatot egy vagy több adatbázishoz. A kapcsolathoz tartozó adatbázisról a Connection.getMetaData() metódussal kaphatunk információt. Ez egy DatabaseMetaData objektumot ad vissza, amelyik az adatbázistáblákról, tárolt eljárásokról, a kapcsolat tulajdonságairól szolgáltat információt. pl. TypeInfo, JDBCMeta, DatabaseInfoServlet (servlet) 5 / 40 6 / 40 Kapcsolat létrehozása Két módon történhet: 1. DriverManager 2. DataSource 1. DriverManager (régebbi) A DriverManager.getConnection() metódusát használjuk, mely paraméterként egy URL-t kap. A DriverManager osztály tartalmaz egy listát a regisztrált driverekkel. A getconnection() metódus hívásakor megpróbálja magtalálni a megfelelő drivert, mely kapcsolódni tud az URL-ben megadott adatbázishoz (sorba kiprobálja a drivereket, míg egyet talál, amely kapcsolódik a megfelelő URL segítségével) Ezt a manager-szintet el lehet kerülni közvetlen Driver metódus hívásával. (csak ritkán használjuk, pl. ha két driver is van, amelyik hozzá tud kapcsolódni egy bizonyos adatbázishoz és explicit szeretnénk meghatározni, hogy melyikkel akarunk kapcsolódni.) Pl.: Class.forName("jdbc.odbc.JdbcOdbcDriver"); //betölti a driver-t a memóriába String url = "jdbc:odbc:mydatabase"; Connection con = DriverManager.getConnection(url, "myusername", "mypassword"); lásd: pl. drivermanager 7 / 40 8 / 40

2. DataSource A DataSource interfész a DriverManager alternatívájaként egy kapcsolat létrehozásának az inkább ajánlott módja. Előnyei: a DataSource-al létrehozott kapcsolatok részt vehetnek connection pooling -ban (kapcsolatobjektum készlet) valamint osztott tranzakciókban. a DataSource objektum JNDI-n keresztül is lekérhető, és az alkalmazástól függetlenül lehet telepítve és létrehozva: a JDBC driver tartalmaz egy DataSource implemenetációt, a rendszeradminsztrátor regisztrálja ezt a JNDI névszolgáltatóval, az alkalmazás pedig a JNDI szerveren regisztrált DataSource-ot egyszerűen lekéri név alapján. (Az alkalmazás tehát nem kell driver információkat hardkódoljon, hanem egy logikai nevet használ a DataSource eléréséhez, így a DataSource megváltoztatható az alkalmazáskód módosítása nélkül) Példák: lásd: pl. datasource.datasourcetableviewer (DataSource közvetlen létrehozása -nem tipikus-), metadata.databaseinfoservlet (kapcsolatobjektum-készletet pooling használó DataSource) 9 / 40 10 / 40 Datasource létrehozása és regisztrálása Kapcsolódás a DataSource-hoz A kód csak illusztrálásként szolgál, tipikusan az alkalmazásszerver konfigurációs fájljában álĺıtjuk be. (Ehhez hasonló kód az alkalmazásszerverben fut le.) VendorDataSource vds = new VendorDataSource(); vds.setservername("my database server"); vds.setdatabasename("my database"); Context ctx = new InitialContext(); ctx.bind("jdbc/mydb", vds); lásd: pl. jndi.testdsbind (NEM tipikus beálĺıtás), jndi.testdslookup Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/MyDB"); Connection con = ds.getconnection("myusername", "mypassword"); A DataSource interfész implementálása háromféle lehet: 1. Alap DataSource osztály: a driver szolgáltató (vendor) adja 2. DataSource osztály, amelyik connection pooling -ot szolgáltat: alkalmazásszerver- vagy driverszolgáltató adja. 3. DataSource osztály, amelyet osztott tranzakciókban használhatunk: az alkalmazásszerver szolgáltató adja (pl. EJB konténer szolgáltató). 11 / 40 12 / 40

Egy alap DataSource-al létrehozott kapcsolat-objektum akárcsak a DriverManager-el létrehozott egy fizikai kapcsolat objektumot hoz létre Connection pooling -ot implementáló DataSource viszont csak egy PooledConnection objektumot ad vissza, amely nem közvetlenül egy fizikai kapcsolat objektum. Lásd pl.: http://commons.apache.org/dbcp/ (szabadon használható adatbáziskapcsolat-készlet implementáció) Az alkalmazás kódja ugyanúgy használja fel a kapcsolatobjektumot, függetlenül attól, hogy DataSource-ból vagy DriverManager-ből hozzuk-e létre, illetve hogy pool -t használ vagy sem. Lényeges, hogy az alkalmazáskód egy finally block-ot kell tartalmazzon, biztosítva ezáltal, hogy a kapcsolat bezáródik akkor is, ha hiba történt (kivétel dobódott). Ez még fontosabb készletet (pool) használó kapcsolatok esetén, hogy az illető kapcsolatot visszajuttassuk a pool-ba az újból rendelkezésre álló kapcsolatok közé. Pl. try { Connection con = ds.getconnection("user", "secret"); //...uzleti logika kod } catch { // SQLException-t kezelo kod } finally { if (con!= null) con.close(); } 13 / 40 14 / 40 Statement Amint a kapcsolat létrejött, az adatbázisnak SQL parancsokat küldhetünk. A JDBC API nem korlátoz a kiadható SQL parancsok tekintetében: bármilyen parancs használható, amit a JDBC driver elfogad. Azt azonban biztosítanunk kell, hogy az adatbázis fel tudja dolgozni a parancsokat. Pl. hívhatunk tárolt eljárásokat egy olyan adatbázisra, amelyik nem támogatja ezeket, de egy kivétel fog dobódni. A JDBC API három interfészt biztosít SQL parancsok küldésére: 1. Statement 2. PreparedStatement 3. CallableStatement Statement A kapcsolat objektum createstatement() metódusával hozhatjuk létre. Ezt paraméter nélküli SQL parancsok hívása használja Statement stmt = con.createstatement(); //lekérdezés: SELECT ResultSet rs = stmt.executequery("select a, b, c FROM Table1"); //módosítás: INSERT, UPDATE, DELETE ES DDL (CREATE TABLE, DROP TABLE) int affectedrows = stmt.executeupdate("update..."); stmt.execute(...) pl. basic.basicsample, basic.join, execute.executesql 15 / 40 16 / 40

PreparedStatement A kapcsolat objektum preparedstatement() metódusával hozhatjuk létre. Előfordított (precompiled) SQL parancsok hívására használjuk. Előnyök a Statement-hez képest: egy vagy több paramétert adhatunk meg neki. hatékonyabb, mert le lesz fordítva és ez el lesz mentve. Többszöri felhasználás esetén érdemes tehát ezt használni. Kiterjeszti a Statement interfészt, tehát örökli ennek metódusait, viszont saját verziókat definiál az executequery, executeupdate és execute metódusokra. Mivel a Statement objektumok nem tartalmazzák az SQL parancsot, ezért paraméterként adjuk meg ezt a fenti metódusoknak. A PreparedStatement objektumok nem adják át paraméterként az SQL parancsokat ezeknek a metódusoknak, mivel ezek már tartalmazzák az SQL parancs előre lefordított változatát. Kivétel dobódik, ha PreparedStatement objektum esetén SQL parancsot adunk át paraméterként ezeknek az örökölt metódusoknak 17 / 40 18 / 40 CallableStatement Mielőtt futtatnánk a PreparedStatement-et, mindegyik paraméternek értéket kell adjunk: PreparedStatement pstmt = con.preparedstatement( "UPDATE table1 SET name =? WHERE id =?"); pstmt.setstring(1, "Rózsa Sándor"); pstmt.setlong(2, 1000); ResultSet rs = pstmt.executequery(); A kapcsolat objektum preparecall metódusával hozhatjuk létre Tárolt eljárások hívására használjuk. 19 / 40 20 / 40

Kötegelt módosítások (Batch Updates) Egy Statement objektum több módosító parancsot egy egységként (kötegelve) küldhet a szervernek. Ez bizonyos esetekben lényeges teljesítménynövekedéshez vezethet. Pl. Statement stmt = con.createstatement(); con.setautocommit(false); stmt.addbatch("insert INTO employees VALUES (1000, Mézga Géza )"); stmt.addbatch("insert INTO departments VALUES (260, Műhód )"); stmt.addbatch("insert INTO emp dept VALUES (1000, 260 )"); Egy kötegen belül mindegyik SQL parancs módosító kell legyen. Hiba esetén BatchUpdateException kivétel dobódik vagy nem dobódik kivétel és tovább fut a köteg, de az updatecounts megfelelő elemére Statement.EXECUTE FAILED íródik. Ez JDBC driver függő. Az eredménytől függően commit vagy rollback következhet. A JDBC driver nem kötelező, hogy implementálja a kötegelt módosításokat. A DatabaseMetaData supportsbatchupdates tulajdonsága alapján lekérdezhetjük. pl. coffee.coffeebatchinsert kötegelt módosítások (beszúrások) int [] updatecounts = stmt.executebatch(); 21 / 40 22 / 40 ResultSet Kurzorok A ResultSet egy Java objektum, amelyik egy SQL lekérdezés eredményét tartalmazza. A különböző mezőkhöz egy soron belül set és get metódusokkal férünk hozzá és a next metódussal megyünk a következő sorra. Pl. Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select a, b, c FROM Table"); while (rs.next()) { // az aktualis rekord ertekeinek kinyerese es kiirasa int i = rs.getint("a"); String s = rs.getstring("b"); float f = rs.getfloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } A ResultSet objektum tartalmaz egy kurzort, amelyik az aktuális sorra mutat. A ResultSet objektum létrehozásakor a kurzor az első sor elé van beálĺıtva, és a next metódus első hívása beálĺıtja az első elemre. Gördíthető ResultSet-ek esetében több metódust használhatunk: previous, first, last, absolute, relative, afterlast, beforefirst pl. coffee.scrollableresultset 23 / 40 24 / 40

ResultSet típusok Konkurencia típusok TYPE FORWARD ONLY: csak előre gördíthető TYPE SCROLL INSENSITIVE: előre-hátra gördíthető vagy egy konkrét pozícióra álĺıtható TYPE SCROLL SENSITIVE: ezen kívül érzékeli az adatváltozásokat, amelyek azóta történtek, amióta kinyitottuk a ResultSet-et. CONCUR READ ONLY: nem módosítható, read-only lock-okat használ, tehát több felhasználó is hozzáférhet az adatokhoz egyidőben (read-only lock akárhány lehet ugyanarra az adatra) CONCUR UPDATABLE: a ResultSet módosítható, tehát a módosított adatokat visszaírja az adatbázisba (write-only lock-okat használ azaz csak egy felhasználó fér egyidőben hozzá az adatokhoz) pl. resultset.resultsetupdate 25 / 40 26 / 40 Példa különböző típusú ResultSet-ek létrehozására: Módosítások Statement stmt = con.createstatement( ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs = stmt.executequery( "SELECT EMP NO, SALARY FROM EMPLOYEES"); PreparedStatement pstmt = con.preparedstatement( "SELECT EMP NO, SALARY FROM EMPLOYEES WHERE EMP NO =?", ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); pstmt.setstring(1, "1000010"); ResultSet rs = pstmt.executequery(); Csak CONCUR UPDATABLE típusú Statement esetében használhatók. Pl.1 Módosítás: rs.absolute(4); rs.updatestring(2, "Mellék u. 321"); rs.updatefloat(3, 10101.0f); rs.updaterow(); Pl.2 Módosítás: rs.absolute(4); rs.updatestring("address", "Mellék u. 321"); rs.updatefloat("amount", 10101.0f); rs.updaterow(); 27 / 40 28 / 40

Tranzakciók Pl. Törlés: rs.first(); rs.deleterow(); Pl. Beszúrás: rs.movetoinsertrow(); rs.updateobject(1, myarray); rs.updateint(2, 3857); rs.updatestring(3, "Blabla"); rs.insertrow(); rs.first(); Egy tranzakció egy vagy több parancsból áll, amelyek lefutottak és vagy mind sikeresen el lett végezve (commit) vagy visszagördültek (roll back). Mikor egy commit vagy rollback hívódik az aktuális tranzakció befejeződik és egy új kezdődik. Egy új kapcsolat (Connection) objektum alapértelmezésben általában auto-commit módban van, ami azt jelenti, hogy a commit metódus automatikusan meghívódik a parancs lefutását követően, azaz a tranzakció egyetlenegy SQL parancsból áll. 29 / 40 30 / 40 A kapcsolat objektumok részt vehetnek osztott tranzakciókban is (több adatbázisszervert magukba foglaló tranzakciók). Ehhez azonban a kapcsolat objektumot kötelezően egy DataSource objektumból kell kinyerjük, amely úgy van implementálva, hogy együttműködjön egy alkalmazásszerver osztott tranzakciós infrastruktúrájával. Ellentétben a DriverManager-ből létrehozott kapcsolatokkal, az ilyen DataSource által létrehozott kapcsolatoknak az auto-commit módja alapértelmezésben ki van kapcsolva. (A DataSource standard implementációja viszont ugyanolyan kapcsolatobjektumokat hoz létre, mint amilyet a DriverManager osztály.) Ha a kapcsolat objektum osztott tranzakcióban vesz részt, a tranzakció manager határozza meg, hogy a commit ill. rollback metódusok mikor lesznek meghívva. Ilyenkor tehát nem hívhatjuk meg közvetlenül ezeket a metódusokat valamint nem álĺıthatjuk az auto-commit módot, mert keresztbe teszünk a tranzakció manager-nek. 31 / 40 32 / 40

Tranzakciós elszigetelési szintek Ha egy adatbázisszerver támogatja a tranzakciókezeléseket, mód van arra, hogy potenciális konfliktusokat elkerüljön, melyek abból adódnak, hogy két vagy több tranzakció fut az adatbázison egyidőben. A kapcsolat objektumnak beálĺıthatjuk a tranzakciós elszigetelési szintjét, ami megadja, hogy az adatbázisszerver milyen szinten gondoskodjon a potenciális konfliktusok megoldásáról. Pl. mi történjen akkor, ha egy tranzakció megváltoztat egy értéket, és egy másik olvassa azt mielőtt az befejeződött commit-al vagy rollback-el? Minél magasabb az elszigetelési szint, annál nagyobb hangsúly lesz fektetve a konfliktusok elkerülésére, viszont annál lassúbb lesz a szerver (a megnövekedett zárak (locks) kezelése valamint a felhasználók csökkentett párhuzamos hozzáférése miatt). A Connection interfész öt szintet definiál. A valódi szintek száma természetesen adatbázisszerver-függő. A settransactionisolation metódussal beálĺıthatjuk a kapcsolat elszigetelési szintjét, és ez vonatkozik a kapcsolat további szesszióira. Hogy ezt megengedjük, beálĺıthatjuk a megfelelő szintet: con.settransactionisolation(transaction READ UNCOMMITTED); 33 / 40 34 / 40 Savepoints A Savepoint interfészt a JDBC 3.0 API vezette be. Egy SavePoint egy ellenőrzőpontot jelöl meg egy tranzakción belül és lehetővé teszi, hogy egy tranzakció visszagördüljön addig a pontig ahelyett, hogy a teljes tranzakció visszagördüljön. Pl.: Statement stmt = con.createstatement(); int rows = stmt.executeupdate("insert INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) DSIDA, JENŐ, KOLOZSVÁR "); Savepoint save1 = con.setsavepoint("savepoint 1"); Egy tranzakcióhoz több Savepoint-ot rendelhetünk. Ezek automatikusan törlődnek commit vagy teljes roll back esetében. Ha egy bizonyos Savepoint-ig gördítünk vissza, az utána definiált Savepoint-ok törlődnek. Expliciten is törölhetünk Savepoint-ot: con.releasesavepoint(save1); Ha egy automatikusan vagy expliciten törölt Savepoint-ra hivatkozunk, SQLException kivétel dobódik. int rows = stmt.executeupdate("insert INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) ROMHÁNYI, JÓZSEF, BP ");... con.rollback(save1); 35 / 40 36 / 40

DAO (Data Access Object) DAO szétválasztja: az adatok feldolgozását (üzleti logika) az adat tárolási logikától előnyei: rugalmasabb alkalmazás (adatbázisszerver v. adatbázis-kezelő keretrendszer megváltoztatása egyszerűbb) átlátható (könnyebben karbantartható) kód használata: DAO interfész az üzleti logika kód számára ajánlott ennek a metódusait hívni interfész implementálása tipikusan egy adatbázistáblával függ össze pl. új bejegyzés beszúrása, összes bejegyzés lekérése, keresési műveletek, stb. (egyúttal a kapcsolat nyitása/zárása) részletesebb leírás, pl.: http://java.sun.com/blueprints/corej2eepatterns/patterns/ DataAccessObject.html 37 / 40 38 / 40 Összefoglalás Java állandósági keretrendszerek (persistence frameworks) Ami JDBC-vel kapcsolatban web-alkalmazás esetén különösen fontos: mivel egy web-alkalmazás esetén egyidőben nagyon sok AB-művelet elvégzését is igénylő kérés érkezhet lehetőleg kapcsolatobjektum-készletben (connection pool) részt vevő kapcsolatobjektumot használjunk amikor épp nincs szükség a kapcsolatobjektumra, zárjuk azt, szabaddá téve a többi kérés számára (minden egyes AB-művelet vagy több, összefüggő művelet végrehajtását követően) a kapcsolat zárását (készletbe való visszajuttatását) helyezzük finally blokkba komplex web-alkalmazás esetén ajánlott az adathozzáférési logikát különválasztani az adatok feldolgozását végző üzleti logikától (lásd. DAO tervezési minta) objektumrelációs leképezés - ORM (Object-relational mapping) objektumorientált alkalmazás relációs adatbázis Néhány nyílt forráskódú keretrendszer: Hibernate MyBatis (korábban ibatis) Torque (Apache DB projekt) Oracle TopLink stb.... 39 / 40 40 / 40