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

Hasonló dokumentumok
JDBC. A JDBC alkalmazása

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

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

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

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

JDBC - adatbáziskezelés

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

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

Java Database Connectivity (JDBC)

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

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

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

Tranzakciókezelés PL/SQL-ben

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 használat I. 5. gyakorlat

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

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

Java és web programozás

JavaServer Pages (JSP) (folytatás)

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

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

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

Java és web programozás

Database Systems II. ZH összefoglaló

SZAKDOLGOZAT. Szabó Attila

MDAC - Microsoft Data Access Components

Adatbázis Rendszerek II. 7. Oracle JDBC

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

ANDROID ALKALMAZÁSFEJLESZTÉS

JAVA PROGRAMOZÁS 8.ELŐADÁS

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

Adatbázis használata PHP-ből

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

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

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

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

Bevezetés: az SQL-be

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

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

Enterprise JavaBeans 1.4 platform (EJB 2.0)

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

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

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

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

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

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

A könyv tartalomjegyzéke

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

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

A Java EE 5 plattform

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

JNDI - alapok. Java Naming and Directory Interface

Kliens oldali SQL-API

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

Adatbázisok* tulajdonságai

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

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

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

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 {

Adatbázisok biztonsága

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

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

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

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

SQL DDL-2 (aktív elemek) triggerek

API tervezése mobil környezetbe. gyakorlat

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

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

Indexek és SQL hangolás

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

SQLServer. Particionálás

Tranzakciók az SQL-ben

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:

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

Vizuális programozás gyakorlat

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

LOGISZTIKAI ADATBÁZIS RENDSZEREK BEVEZETÉS

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

S04-2 Elosztott alkalmazások készítése

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet. Java Web technológiák

Adatba ziskezeles. Java tutorial JDBC. JDBC: Java Data Base Connectivity. Pelda: bro ker ceg. Rela cio s adatba ziskezeles - attekintes

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

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

GPRS Remote. GPRS alapú android applikáció távvezérléshez. Kezelési útmutató

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

Adatbázis-kezelés. Harmadik előadás

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

B IT MAN 43/1 B IT MAN. Adatbázis Rendszerek II. Ellenőrző kérdések JDBC. v:

OOP és UML Áttekintés

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

Az Oracle rendszer komponensei

Átírás:

JDBC adatbázis-hozzáférés Java-ból

Áttekintés Bevezetés Kapcsolat objektumok SQL parancs küldés Válasz feldolgozása Tranzakciók DAO tervezési minta

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). JDBC meghajtó szolgáltatók, lásd: http://developers.sun.com/product/jdbc/drivers

A JDBC alkalmazási területei 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

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"); }

Adatbáziskapcsolat objektumok (Connection) 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)

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

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)

Datasource létrehozása és regisztrálása 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

Kapcsolódás a DataSource-hoz 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ó).

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(); }

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 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

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

Mielőtt futtatnánk a PreparedStatement-et, mindegyik paraméternek értéket kell adjunk: PreparedStatement pstmt = con.preparestatement( "UPDATE table1 SET name =? WHERE id =?"); pstmt.setstring(1, "Joe"); pstmt.setlong(2, 1000); ResultSet rs = pstmt.executequery();

CallableStatement A kapcsolat objektum preparecall metódusával hozhatjuk létre Tárolt eljárások hívására használjuk.

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, Joe Jones )"); stmt.addbatch("insert INTO departments VALUES (260, Shoe )"); stmt.addbatch("insert INTO emp dept VALUES (1000, 260 )"); int [] updatecounts = stmt.executebatch();

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)

ResultSet 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); }

Kurzorok 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

ResultSet 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.

Konkurencia típusok 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

Példa különböző típusú ResultSet-ek létrehozására: Statement stmt = con.createstatement( ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); ResultSet rs = stmt.executequery( "SELECT EMP NO, SALARY FROM EMPLOYEES"); PreparedStatement pstmt = con.preparestatement( "SELECT EMP NO, SALARY FROM EMPLOYEES WHERE EMP NO =?", ResultSet.TYPE SCROLL SENSITIVE, ResultSet.CONCUR UPDATABLE); pstmt.setstring(1, "1000010"); ResultSet rs = pstmt.executequery();

Módosítások Csak CONCUR UPDATABLE típusú Statement esetében használhatók. Pl.1 Módosítás: rs.absolute(4); rs.updatestring(2, "321 Kasten"); rs.updatefloat(3, 10101.0f); rs.updaterow(); Pl.2 Módosítás: rs.absolute(4); rs.updatestring("address", "321 Kasten"); rs.updatefloat("amount", 10101.0f); rs.updaterow();

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, "Mysteries"); rs.insertrow(); rs.first();

Tranzakciók 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.

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.

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? Hogy ezt megengedjük, beálĺıthatjuk a megfelelő szintet: con.settransactionisolation(transaction READ UNCOMMITTED);

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.

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) TOLSTOY, LEO, RUSSIA "); Savepoint save1 = con.setsavepoint("savepoint 1"); int rows = stmt.executeupdate("insert INTO AUTHORS VALUES " + "(LAST, FIRST, HOME) MELVOY, HAROLD, FOOLAND ");... con.rollback(save1);

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.

DAO (Data Access Object) 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

DAO 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

Összefoglalás 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)