Applikationsprogramgränsnitt mot relationsdatabaser

Relevanta dokument
INTRODUKTION TILL JDBC

Klientprogrammering mot databaser

Sample exam questions. Database exam TIG058

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Lösningsförslag, tentamen i Databaser

Innehåll. Föreläsning 3. javax.naming.context. javax.sql.datasource. Vad är JDBC? Java Naming and Directory Interface(JNDI) Viktigaste metoder:

2I1070 Lektion 2 Servlets och databaskopplingar Internetprogrammering 2I1049 Treskiktsarkitektur Klient-server med servlets

Tentamen DATABASTEKNIK - 1DL116

Högskolan Dalarna sid 1 av 5 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Tentamen DATABASTEKNIK - 1DL116, 1MB025, 1DL124

Genomgång av tentamen. Databasteknik ITHS 4/3 2016

Stored procedure i ASP.NET

Föreläsning 2. Operativsystem och programmering

Datainsamling över Internet

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

VAD GÖR DU / VEM ÄR DU?

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

ADO.NET Murach Kapitel 17-20

Classpath. Class loading + resurser. Class loader. jar-filer

Stored procedure i ASP.NET

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Mål med lektionen! Veta kursmålen. Ha kännedom om några av de grundläggande begreppen.

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

VAD GÖR DU / VEM ÄR DU?

Webbservrar, severskript & webbproduktion

Innehåll. MySQL Grundkurs

Lektion 5 HTML, CSS, PHP och MySQL

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Länkning av Prolog under C

F8 Webbteknologier 1. Dynamiska webbsidor

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Karlstads Universitet, Datavetenskap 1

1 Systemkrav avantraupphandling

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Göteborgs universitet Chalmers Tekniska Högskola

SQLs delar. Idag. Att utplåna en databas. Skapa en databas

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Mål med lektionen! Repetera och befästa kunskaperna.

Creo Customization. Lars Björs

F5: Högnivåprogrammering

FÖ 07 - JDBC Åtkomst till databaser från applikationer med Java - exempelkod -

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

12 juni 2009 Projektplan Webb-baserat bokningssystem för flyg Kurs: Applikationsutveckling för internet, TFE

Ingenjörsfirman Stéen Java Sida 1 av 1

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

Introduktion till Jasmine 1.2 ODQL

FÖRSLAG TILL LÖSNINGAR, TENTAMEN I IKB007 INTERNETPROGRAMMERING MED JAVA, 5p för SY2, , kl

Systemrekommendation. Artvise Contact Center

Nya webbservern Dvwebb.mah.se

Vad är en databas? Databasutveckling Med MySQL/MariaDB

Laboration 5 - Biblioteksapplikation

INNEHÅLL. Konfigurering av SQL Server. Egenskaper Kommunikationsprotokoll

Systemkrav. Artvise Kundtjänst

Tentamen DATABASTEKNIK - 1DL116, 1MB025

DB2-åtkomst från WebSphere

Opensource och SGUs webbplattform. Anette Lundberg & Jonas Holmberg

Gränssnitt för FakeGranska. Lars Mattsson

Program & programmering

Repetition DK2 Middleware, P2P, Multimediatransport. Stefan Alfredsson 18 Mars 2005

Webbprogrammering. Sahand Sadjadee

Introduktion till programmering och Python Grundkurs i programmering med Python

F5: Högnivåprogrammering

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

Hjälpmedel för kompilatorkonstruktion, DVB004

Databaser - Design och programmering. Kursöversikt. Exempel: telefonbok. Varför databaser?

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Laboration 1 Introduktion till Visual Basic 6.0

Distribuerade affärssystem

F4. programmeringsteknik och Matlab

Olika slags datornätverk. Föreläsning 5 Internet ARPANET, Internet började med ARPANET

Disposition. 1. Kopplingen mellan Processanalys (DFDdiagram) 2. Treskikts Client-Server arkitektur (Fig 1.8) 3. Data layer

Vyer, Prepared Statements, Triggers

Web Services. Cognitude 1

! Teori och praktik. ! Ändringar från förra året. ! Examination (tenta, projekt) LiU. ! Varför ni? ! Varför överhuvudtaget? LiU

Idag. Hur skapar vi och underhåller en databas? DD1370 (Föreläsning 4) Databasteknik och informationssystem 7,5 hp Hösten / 20

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

Webservice & ERP-Integration Rapport

Introduktion till MySQL

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Kopiering av objekt i Java

Datorarkitekturer med operativsystem ERIK LARSSON

Capitex dataservertjänst

PROV. 13 JSP Standard Tag Library

Lite mer om CGI-programmering

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

CliMate: Laboration 3 dataselektion

PHP-presentation Dataföreningens Open Source-nätverk

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Tentamen ID1004 Objektorienterad programmering May 29, 2012

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

i LabVIEW. Några programmeringstekniska grundbegrepp

Webprogrammering och 729G28 databaser Webprogrammering och databaser Kursöversikt Webprogrammering Designprocessen Lösningsförslag

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Webbprogrammering - 725G54 PHP. Foreläsning II

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Föreläsning 2: Översikt över ett databassystem

Transkript:

Applikationsprogramgränsnitt mot relationsdatabaser Tore Risch, Uppsala Database Laboratory Uppsala University, Sweden Tore.Risch@it.uu.se 2 maj 2004 1 Inledning Det finns i huvudsak tre sätt kommunicera med relationsdatabaser genom SQL: 1. I textuella frågegränssnitt matar användaren in SQL satser som textsträngar som sedan sänds till databasservern för exekvering. SQL-satserna kan också läsas från fil. Slutanvändaren kommer vanligtvis inte i kontakt med det textuella gränssnittetsom i huvudsak används av databasprogrammerare. Textuella frågegränssnittanvänds dock av kunniga användaresom har behov att ställa avancerade databasfrågor. 2. I grafiska frågegränssnitt byggs SQL-satserna upp av systemet baserat på grafiska användargränssnitt. Det mest spridda är MS Access som har ett grafiskt gränssnitt där frågor specificeras m.h.a. formulär, kallat Query By Example (QBE). När en fråga exekveras genereras först SQL-satser som sänds till databashanteraren för exekvering. Grafiska gränssnitt används av databasprogrammerare och användare. Kräver i allmänhet mindre kunskaper än textuellt SQL-gränssitt men kan inte hantera alla möjliga SQLfrågor, och det kan vara mer komplicerat att specificera avancerade frågor. 3. Det vanligaste sättet att använda relationsdatabaser är dock att man kör ett applikationsprogram som internt anropar SQL. För detta behövs SQL applikationsprogramgränssnitt mellan olika programmeringsspråkoch SQL-databaser. I huvudsak finns två typer av SQL applikationsprogramgränssnitt, inbäddad SQL och SQL klientgränssnitt. Applikationprogramgränssnitten måste uppfylla följande krav: 1. Man måste kunna hantera uppkopplingar mellan applikationsprogrammet och databasen, s.k. sessioner. 1

2. Man måste kunna sända SQL-satser till databashanteraren för exekvering. Ett speciellt problem är att SQL-satserna kan potentiellt returnera mycket stora resultatmängder, eventuellt större än tillgängligt primärminne. 3. Det kan ta lång tid att optimera en SQL-fråga. Gränssnittet måste ha metoder att undvika onödig SQL-optimering. 2 SQL klientgränssnitt Varje databashanteringssystem (DBHS, eng. DBMS) tillhandahåller ett tillverkarspecifikt klientgränssnitt i form av ett subrutin- eller klassbibliotek. Man kan där koppla upp sessioner, sända SQL-satser till databasen och hantera konverteringar av data mellan SQL och applikationsvariabler. Dessa gränssnitt är dock DBHS-specifika och man blir lätt uppbunden mot speciell tillverkare om man gör sig beroende av dem. För att göraapplikationsgränssnitten DBHS-oberoende har man utvecklat de standardiserade klientgränssnitten ODBC och JDBC. Dessa gränssnitt anropar de tillverkarspecifika klientgränssnitten internt. 2.1 ODBC ODBC, Open DataBase Connectivity är ett DBHS-oberoende SQL klientgränssnitt. ODBC är utvecklat av MicroSoft men är oberoende av operativsystem och har blivit en de facto industristandard för SQL klientgränssnitt. Nära besläktat är SQL/CLI, SQL Call Level, som är en ISO standard för SQL klientgränssnitt. SQL/CLI är till största delen identiskt med ODBC. Med ODBC (SQL/CLI) kan man utveckla applikationsprogram som är oberoende av relationsdatabastillverkare, och man kan t.o.m. göra applikationer som anropar mer än ett underliggande DBHS. ODBCs arkitektur illustreras av figur 1. Applikationsprogrammet (vanligtvis i C/C++) länkas ihop med ett bibliotek av ODBC gränssittsfunktioner. Gränssnittsfunktionerna anropar en generell ODBC drivrutinshanterare (driver manager) till vilken inlänkats en eller flera DBHS-specifika ODBC drivrutiner. Varje DBHS-specifik ODBC drivrutin innehåller kod för att översätta mellan ODBCs standardgränssnitt och det klientgränssnitt som resp. tillverkares relationsdatabas använder 1. Det DBHS-specifika gränssnittet anropas av OBDC drivrutinen för att kommunicera med relationsdatabasen. Normalt körs applikationsprogrammet i en process och databasservarna på separata maskiner 2. 2.2 JDBC JDBC, Java DataBase Connectivity är ett ODBC-liknande gränssnitt för programmeringsspråket Java. Ursprungligen var funktionaliterna i JDBC och ODBC 1 I figuren exemplifieras detta för DBHS, och. 2 I MS Access körs allt dock i samma process på en maskin, dvs. MS Access databashanterare är länkad direkt till MS Access ODBC drivrutin. 2

Application ODBC Application Program Client Client Manager Client Client (s) Figur 1: ODBCs arkitektur identiska, men viss divergering har skett med tiden. En direkt (native) JDBC implementering har arkitektur som illusterat i figur 2. En skillnad mot ODBC är att drivrutinhanteraren för JDBC körs i en separat server, ofta del av en s.k. applikationsserver. Till Javaapplikationen länkas ett klassbibliotek, JDBC klientbiblioteket, för gränssnitt mot JDBC. JDBC klientbiblioteket kommunicerar över datornätverket med JDBC drivrutinhanteraren som körs i separat process/maskin. Drivrutinhanteraren är uppbyggd analogt som JDBC med specifika drivrutinhanterare som översätter till och anropar DBHS-specifika klientgränssnitt. En viktig anledning till denna trenivåarkitektur (3-tier architecture) med separat mellanprogramvara (middleware) för JDBC drivrutinhanteringen är att det möjliggör att klienten blir en ren (pure) Javaapplikation som helt är kodad ijava,även om de DBHS-specifika gränssnitten är kodade i C/C++. Eftersom JDBC och ODBC är så lika är det vanligt att JDBC tillhandahålles genom en JDBC-ODBC brygga, illustrerat i figur 3. Där använder man en ODBC drivrutinhanterare som en speciell JDBC drivrutin. Detta gör att man sparar implementeringsarbete att utveckla nya JDBC drivrutiner för olika databashanterare utan kan utnyttja redan implementerade ODBC drivrutiner. Nackdelen är att det blir en extra mjukvarunivå, vilket inte alltid har så stor betydelse med tanke på att kommunikationstiden oftast dominerar. 3

Client Application JDBC Client JDBC Driver Manager Middleware JDBC Driver JDBC Driver JDBC Driver Client Client Client (s) Figur 2: JDBCs arkitektur 2.3 Programmering av SQL klientgränssnitt Som exempel på hur SQL klientgränssitten är utformade använder vi JDBC. Både ODBC och DBHS-specifika SQL klientgränssnitthar samma struktur, men andra funktionsnamn etc. Antag att vi har en tabell EMPLOYEE(SSN,NAME,INCOME) och vi vill skriva ett program som skriver ut namet på alla som tjänar mer än 100000. Följande JDBC program gör detta: 4

Client Application JDBC Client Middleware JDBC-ODBC Bridge Manager Client Client Client (s) Figur 3: JDBC genom JDBC-ODBC brygga { } // Load SUN s JDBC-ODBC bridge: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Connect to database server S: Connection con = DriverManager.getConnection("jdbc:odbc:S", "mylogin", "mypassword"); // Create JDBC statement holder: Statement stmt = con.createstatement(); String query = "SELECT NAME FROM EMPLOYEE WHERE INCOME > 10000"; ResultSet rs = stmt.executequery(query); // Iterate over query result: while (rs.next()) // while tuples in result set do { String s = rs.getstring("name"); System.out.println(s); } Metoden executequery tar en SQL-fråga som argument och sänder den till 5

databasservern för exekvering. Eftersom resultatet från en fråga kan vara mycket större än tillgängligt primärminne behövs speciell metod för att hantera svaret från frågan. Gränssnitt mot relationsdatabaser som JDBC och ODBC är därför strömmade. T.ex.får man i JDBC resultatet som en ström av rader representerade av klassen ResultSet som man sedan itererar över som i exemplet. Man kan tycka att det vore enklare att returnera en datatyp representerade hela resultattabellen som en datastruktur i Java, men en sådan lösning fungerar inte för stora resultatmändger som inte får plats i minnet. T.ex. är det lätt att av misstag glömma joinvillkor vilket genererar mycket stor resultattabell som ej får plats i Java-minnet. Ett annat problem med SQL är att optimering av SQL-satser kan vara mycket dyrbart 3.Manhardärför utvecklat mekanismer för att undvika att optimera frågan varje gång den anropas. I vårt exempel kanske man vill göra ett program som i en slinga (loop) läser in undre inkomstgränser från användaren och sedan skriver ut alla som tjänar bättre. Följande kod gör detta: { } // Load SUN s JDBC-ODBC bridge: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // Connect to database server S: Connection con = DriverManager.getConnection("jdbc:odbc:S", "mylogin", "mypassword"); Statement stmt = con.createstatement(); // Parameterized query: String query = "SELECT NAME FROM EMPLOYEE WHERE INCOME >?"; Int incomelimit; // Prepare parameterized query: PreparedStatement getpersons = con.preparestatement(query); while(...){ // Code to read lower income limit into incomelimit... // Set 1st parameter to incomelimit: getpersons.setint(1,incomelimit); ResultSet rs = stmt.executequery(getpersons); // Iterate over query result: while (rs.next()) { String s = rs.getstring("name"); System.out.println(s); } } Metoden preparestatement kompilerarochoptimerar, preparerar, en parametriserad SQL-fråga. Parametrarna markeras med? och numreras internt 1,2,3, etc. 3 Kostnaden är O(2 Q ), där Q är hur många operatorer som finns i frågan. 6

vartfter de dyker upp i frågan. Bara värden kan parametriseras och? kan således inte placeras hur som helst. Med metoden setint sätter man en given parameter i den preparerade frågan till ett heltal 4. En preparerad fråga anropas på samma sätt som andra frågor. M.h.a. preparestatement sparar man optimeringstid om man vill anropa samma fråga flera gånger. 3 Inbäddad SQL Om en fråga är komplicerad kan det ta en hel del tid att preparera den. I ODBC/JDBC innebär detta att det tar tid att starta program som först gör en massa preparestatement. För att spara ytterligare prepareringstid och även för att förenkla gränsnittet mot databasenhar man utvecklatinbäddad SQL, illustrerat i figur 4. I inbäddad SQL har man utvidgat ett konventionellt programmeringsspråk (C, C++, Java, etc) med anrop till SQL-satser. SQL-satserna markeras på ett speciellt sätt och en speciell kompilator, en förprocessor, översätter uppmärkta SQL-satser till anrop till det DBHS-specifika klientgränssnittet. Förprocessorn preparerar därvid SQL-satserna inbäddade i applikationen, och de preparerade satserna sparas i databasserven. Därefter kompileras det förprocessade programmet som vanligt. Application program With embedded SQL SQL preprocessor SQL Query processor Database Regular program CLI interface Optimized query plan Figur 4: Inbäddad SQL När man vid senare tillfälle exekverar programmet sker ingen preparering alls, utan det sker direkt parametriserade anrop av preparerade satser i databasservern. Om en exekveringsplan blivit inaktuell p.g.a. databasuppdateringar sker ompreparering dynamiskt när exekveringsplanen anropas nästa gång. Att amortera av optimeringskostnaden är den viktigaste anledningen att använda inbäddad SQL. En mindre viktig anledning är att inbäddad SQL kan vara något enklare att anropa från högnivåspråk än med SQL klientgränssnitt. 4 Motsvarande metoder finns för flyttal, strängar, etc. 7

4 Databasprocedurer Databasprocedurer (eng. stored procedures) är program skrivna i en procedurell utvidgning av SQL som körs inuti databasservern. På så vis kan man göra både beräkningar och bearbetningar av data på databasservern. Det finns följande anledningar att använda databasprocedurer: Mindre kommunikationstid. Ofta varvas flera datahämtnings- och beräkningsfaser i en applikation så attmanhämtar först data, gör sedan vissa beräkningar över hämtade data, gör sedan ytterligare frågor baserade på resultatet av beräkningarna, etc. Om alla beräkningar görs i klienten kan det behövas en hel del kommunikation mellan databasservern och klienten. Detta kan innebära betydande prestandaförluster, speciellt om tiden för tur-och-retur meddelande till databasservern är lång eller om många interaktioner sker mellan klienten och servern. Bättre systemstruktur. Generell kod vars syfte är bearbetning och underhåll av data hör naturligt hemma tillsammans med databasen. T.ex. kod för att skapa nya data (t.ex. skapa konto, lägga in order) kan innebära att indata måste kontrolleras och ett antal tabeller uppdateras. Genom skapa data med databasprocedurer får man konsistent uppdatering av databasen. Förkompilerade frågor. Som tidigare nämnts är frågeoptimering dyrbart, vilket ju är anledningen till att man infört prepare och inbäddad SQL. Ett alternativt till detta är att förkompilera frågorna genom att lägga in dem i anrop från databasprocedurer. Frågeoptimeringen sker då när proceduren defineras för databashanteraren. Olika databashenteringssystem har tidigare haft olika SQL-utvidgningar för databasprocedurer. Numera är dock databasprocedurer standardiserade genom SQL-PSM som är del av SQL-99. I SQL-PSM defineras databasprocedurer med ett kommando CREATE PROCEDURE namn(deklarationer) BEGIN SQL-PSM satser END SQL-PSM satserna kan vara vanliga SQL-satser (t.ex. uppdateringar) eller speciella SQL-PSM satser för t.ex. felhantering. För att på ett skalbart sätt kunna anropa SELECT-satser som returnerar stora datamängder har man ett strömorienterat gränssnitt liknande JDBC/ODBC och inbäddad SQL. En speciell markör kallad cursor indikerar position i resultattabell från en fråga, liknande ResultSet i JD- BC. T.ex. följande procedur beräknar medelvärde och varians av lönerna i en avdelning: CREATE PROCEDURE lönestatistik( IN avd CHAR[20], 8

OUT medel REAL, OUT varians REAL) DECLARE räknare INTEGER; BEGIN SET medel = 0.0; SET varians = 0.0; SET räknare = 0; FOR markör AS SELECT lön FROM anställda WHERE avdelning = avd; DO SET räknare = räknare + 1; SET medel = medel + lön; SET varians = varians + lön * lön; END FOR; SET medel = medel / räknare; SET varians = varians/räknare - medel * medel; END; När ovanstående procedur skickas till databasservern komplieras den, inbäddade frågor optimeras, och optimal kompilerad kod läggs i servern. Databasprocedurer anropas med satsen CALL procedur(parametrar); Databasprocedurer anropas från JDBC genom en speciell klass, CallableStatement. Liknande konstruktioner finns i ODBC, inbäddad SQL, etc. 5 Applikationsservrar För att begränsa systemkraven hos klientdatorn vill man ofta göra det möjligt att interagera med applikationen från en vanlig web-browser utan att behöva ladda ner program. Sådana applikationer måste köras på en server, en mellanserver, illustrerat av figur 5. Web-browsern interagerar då med ett serverprogram, applikationsservern, i mellanservern m.h.a. HTML. På serversidan finns speciella web-sidor som innehåller HTML-kod med inbäddad applikationsprogramkod som anropas från applikationsservern. Applikationskod kommer åt relationsdatabaser genom t.ex. Java och JDBC. Om programmeringsspråket för applikationerna är Java kallar man websidorna på servernjava Pages, JSP och programmen som anropas från applikationsserven kallas servlets. Enkänd applikationsserver för Java är Apache TomCat. Liknande system finns för bl.a. Microsoft (ASP). Fördelen med applikationsservrar är att klientkraven hålls begränsade (s.k. thin client). Nackdelen är att all interaktion sker genom HTML, att alla beräkningar måste göras i applikationsservern, och att flera lager av servrar kan vara ineffektivt. Speciellt om man har avancerad grafik eller mycket användarinteraktion kan det bli långsamt. Det kan då varabättre att i stället ladda ner en Java applet i klienten som sköter bearbetningar och grafik och som direkt anropar 9

Middle-tier Application Application Client Browser Application (e.g. Tomcat) JDBC Driver Database Figur 5: Applikationsserver databasen genom JDBC, som beskrivet tidigare. Ett annat alternativ är att lägga bearbetningar i databasprocedurer som anropas från klientprogrammmen. För enkla applikationer som har ett formulärorienterat användargränssnitt är dock applikationsservrar OK. Kombination av klient och mellanserverprogram används ofta. T.ex. tillåter att man kör Java i klient, mellanserver, eller t.o.m. i databasservern själv, vilket ger utrymme för intressanta designbeslut. Eftersom HTML är tillsåndslöst är ett speciellt problem för applikationsservrar hur man upprätthåller sessioner mot systemet. Applikationsservrar använder antingen coockies eller genererade URLer för att spara tillstånd för en klient mellan olika webbsidor. 10