Sovellusarkkitehtuurit



Samankaltaiset tiedostot
RDBMS - Yhteyskäytännöt

Sovellusarkkitehtuurit

Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 Tietokantaohjelmointi Harri Laine 1. SQL:n käyttö ohjelmissa

käännös käännösvaiheessa tarkasettaan linkitys

EXEC SQL BEGIN DECLARE SECTION

Johdanto Javaan ja tietokantojen käsittelyyn Java Database Connectivity (JDBC)

Java ja tietokannan käsittely (JDBC)

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito. SQL - Tietokannan ylläpito

Sovellusarkkitehtuurit

Tehtävä 1. Tietojen lisääminen, poistaminen, päivittäminen ja tulostaminen

Tietokannat II -kurssin harjoitustyö

Tietokantaohjelmoinnin tekniikkoja Java-kielellä

Pedacode Pikaopas. Tietokantaa hyödyntävän sovelluksen luominen

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

5. HelloWorld-ohjelma 5.1

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

HELIA TIKO-05 SQL-TRANSAKTIOT 1 ( 12) ICT03D Tieto ja tiedon varastointi

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Web Services tietokantaohjelmoinnin perusteet

LINUX-HARJOITUS, MYSQL

8. Näppäimistöltä lukeminen 8.1

4. Luokan testaus ja käyttö olion kautta 4.1

12. Näppäimistöltä lukeminen 12.1

Tietokannan webbikytkentä. Janne Petäjä

Java-kielen perusteet

5. HelloWorld-ohjelma 5.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

8. Näppäimistöltä lukeminen 8.1

Microsoft Visual Studio 2005

Olio-ohjelmointi Javalla

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

HELIA TIKO-05 1 (22) ICT03D Tieto ja tiedon varastointi E.Räty, O.Virkki

Case TUHTI. Projektin tunnuslukuja. ! Suuri perusjärjestelmäuudistus! Työt alkoivat kesällä ! Java luokkia n. 5000

HOJ Haja-aiheita. Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10

Tietokannat II -kurssin harjoitustyö

Sisältö. 22. Taulukot. Yleistä. Yleistä

Listarakenne (ArrayList-luokka)

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Maiju Mykkänen Susanna Sällinen

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmoinnin perusteet Y Python

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Tietokannanhoitaja DBA (Database Administrator) ja tietokannan hallinta

Java-kielen perusteet

16. Javan omat luokat 16.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Rajapinta (interface)

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

Visual Basic -sovelluskehitin Juha Vitikka

15. Ohjelmoinnin tekniikkaa 15.1

Oracle-tietokanta. Riku Nykänen 1/2010

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

TIETOKANTOJEN PERUSTEET MARKKU SUNI

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Lohtu-projekti. Ylläpitäjän dokumentti. Versiohistoria: Ensimmäinen versio Andreas Asuja

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

HELIA 1 (14) Outi Virkki Tiedonhallinta

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

TIETOKANNAT JOHDANTO

17. Javan omat luokat 17.1

14. Poikkeukset 14.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Tikon Ostolaskujenkäsittely/Web-myyntilaskutus versio 6.3.0

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

SQL - STRUCTURED QUERY LANGUAGE

EJB-komponenttien tietokantakytkentä

Tietokantakurssit / TKTL

Java-kielen perusteita

Ylläpitodokumentti. Ohjelmistotuotantoprojektin tietojärjestelmä OhtuTie

Microsoft Visual J++ ohjelmointiympäristö

11. Javan toistorakenteet 11.1

HSMT J2EE & EJB & SOAP &...

Koira testissä vai Racci tuotannossa O10G/IAS10 Linuxilla

15. Ohjelmoinnin tekniikkaa 15.1

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

12. Javan toistorakenteet 12.1

1. Olio-ohjelmointi 1.1

Java-kielen perusteita

12. Javan toistorakenteet 12.1

public static void main (String [] args)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Järjestelmäarkkitehtuuri (TK081702) Järjestelmäarkkitehtuuri. Järjestelmäarkkitehtuuri

Transkriptio:

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 1 ( 19) Sovellusarkkitehtuurit Edellä olemme tutustuneet SQL-kieleen ja transaktiokäsittelyn periaatteisiin. Tarkastelemme tässä osiossa tietokantakäsittelyn ohjelmointia (data access technologies) keskeisissä sovellusarkkitehtuureissa. Tutustumme lähinnä standardoituihin teknologioihin ja erityisesti Javan tietokantaliittymään JDBC. Sovellusarkkitehtuurien perusmalli on 2-kerroksinen asiakas/palvelin (Client/Server). Tyypillinen sovellusarkkitehtuuri kattaa nykyisin useamman kerroksen, mutta kunkin kerroksen välillä näissäkin on asiakas/palvelin suhde. Tietokantapalvelin on näissä arkkitehtuureissa perimmäinen ja tietokantaohjelmointia tarvitaan siis tämän kerroksen asiakaskerroksen ohjelmoinnissa. Osa I Client/Server ja tietokantaohjelmoinnin rajapinnat Perinteinen tietokantojen sovelluskäyttö on perustunut asiakas/palvelin (Client/Server) -arkkitehtuurin, missä sovellusohjelma tai esimerkiksi SQLkomentojen testaamiseen tarkoitettu SQL-editori (esimerkiksi Oraclen SQLPlus) on tietokantapalvelun asiakas ja tietokantapalvelin (instanssi) on toteutettu tyypillisesti erillisessä palvelinkoneessa DBMS-järjestelmällä. DBMS-järjestelmän palvelujen ohjelmointirajapinta (Application Programming Interface, API) on toteutettu kussakin järjestelmässä omalla funktiokirjastolla, esimerkiksi Oraclella OCI-kirjastolla. Etäpalvelimen turvallinen käyttö edellyttää lisäksi erillisten verkkopalvelujen asennuksia. Tällainen Oraclen verkkopalvelunohjelmisto on SQL*Net. DBMS:n funktiokirjaston käytön ohjelmointia on helpotettu esikääntäjätekniikalla, mistä käytetään nimitystä upotettu SQL. Sovelluskoodiin Upotettu SQL Embedded SQL (ESQL) oli ensimmäinen standardoitu SQL-pohjainen tietokantaliittymä, joka mahdollisti lähes DBMS-järjestelmästä riippumattoman tietokantaohjelmoinnin. Sovelluksen ohjelmointiin käytettyä ohjelmointikieltä kuten esimerkiksi COBOL, Fortran, PL/I, C tai C++ sanotaan tässä isäntäkieleksi. Kuvassa 1 on pieni Oraclen C-kielinen esimerkki, joka kuvaa SQL-kielen upotusta sovelluskoodiin EXEC SQL lauseina ja SQL-lauseen parametrointia käyttäen kaksoispistenotaatiolla sovelluskoodin muuttujia input ja output parametreina (host variables). Kuvassa 1b esitetään ESQL-ohjelman kehitysvaiheet. SQL-komennot testataan ensin SQL-editoria käyttäen. Testatut SQL-komennot upotetaan sovellusohjelman lähdekoodiin. Näin muodostettu ESQL-ohjelma käännetään ensin isäntäkielelle

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 2 ( 19) sovitetulla esikääntäjällä (precompiler) sovelluskoodiksi, missä EXEC SQL lauseet muutetaan dokumentointia varten kommenteiksi, joiden perään generoidaan kulloisenkin SQL-komennon toteuttava DBMS-järjestelmän funktiokirjaston funktioiden kutsusarjat. Järjestelmästä riippuen esikääntäjä voi jo tarkistaa SQL-komennot tietokannasta luetun metatiedon perusteella ja tallettaa SQL-komentojen suorituksen optimoidut suoritussuunnitelmat tietokantaan (Static SQL). Suoritettavaa ohjelmakoodia varten näin generoitu ohjelmakoodi käännetään ohjelmointikielen kääntäjällä ja siihen linkitetään tarvittavat funktiokirjastot. Kuvan 1 EXEC SQL lause hakee tietokannasta yhden rivin ja latoo sen arvot isäntäkielen muuttujiin. Jos käytetty SQL-komento tuottaa monirivisen tulosjoukon, käytetään tämän ohjelmalliseen käsittelyyn kursori-käsittelyä. Tietokantakäsittelyssä voi sattua erilaisia poikkeustilanteita tai virheitä. EXEC SQL lauseen suorituksen jälkeen näitä tutkitaan järjestelmäkohtaisesta SQLCodemuuttujasta (jonka arvoista on standardoitu seuraavat: 0 = ei virheitä, 100 = ei löytynyt yhtään riviä, negatiiviset arvot ovat virheitä ja positiiviset huomautuksia) tai SQLState-muuttujista, jonka arvot on standardoitu.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 3 ( 19)... #define UNAME_LEN 10... int emp_number; /* Define a host structure for the output values of a SELECT statement. */ /* No declare section needed if precompiler option MODE=ORACLE */ struct { VARCHAR last_name[uname_len]; float salary; float commission_pct; emprec; /* Define an indicator structure to correspond to the host output structure. */ struct { short emp_name_ind; short sal_ind; short comm_ind; emprec_ind;... /* Select columns last_name, salary, and commission_pct given the user's input * for employee_id. */ EXEC SQL SELECT last_name, salary, commission_pct INTO :emprec INDICATOR :emprec_ind FROM employees WHERE employee_id = :emp_number;... Kuva 1. Osa C-ohjelmaa, johon on upotettu SQL-komentoja (lähde: Oracle Database Application Developer s Guide Fundamentals)

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 4 ( 19) 2) SQL-komentojen upotus lähdekoodiin SQL-komennot 1) SQL-komentojen testaus Lähdeohjelma + ESQL SQL-editori isäntäkielen ESQL-esikääntäjä Lähdeohjelma + funktiokutsut isäntäkielen kääntäjä 4) tietokannan käyttö 3) tietokannan metatiedon käyttö SQL-jäsennys optimointi ja suoritussuunnitelman mahdollinen talletus tietokantaan välikoodi funktiokirjasto Linkittäjä DBMS suoritettava sovelluskoodi tietokanta Kuva 1b. ESQL-ohjelman kehitysvaiheet ESQL-ratkaisut ovat järjestelmäkohtaisen funktiokirjaston ja sille rakennetun esikääntäjätoteutusten vuoksi järjestelmäsidonnaisia. DBMS:n SQL-murretta välttävä ja SQL-standardin yksinkertaisia tietotyyppejä ja lauserakenteita käyttävä lähdekoodi voi kuitenkin jo olla siirrettävää eli käytettävää DBMS-järjestelmää voidaan vaihtaa käyttämällä toisten järjestelmien ESQL-esikääntäjiä.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 5 ( 19) SQL/CLI ja ODBC SQL-standardiin on ESQL:n jälkeen määritelty myös SQL Call Level Interface (SQL/CLI), joka määrittää järjestelmäriippumattoman funktiokirjaston SQLkomentojen suoritukseen. Tämä on toteutettu lähes sellaisenaan IBM:n DB2- järjestelmän uutena funktiokirjastona. SQL/CLI:n varhaisen työversion pohjalta Microsoft toteutti 90-luvun alussa ODBCkirjaston, missä lähinnä C/C++ -tietokantaohjelmointia varten määritelty ODBC API tarjoaa universaalin tietokantaohjelmoinnin rajapinnan. Sovelluksen paikalliseen Windows-rekisteriin määritellään tietokantayhteyttä varten ns. tietolahde (Data Source), johon määritetään yhteyden rakentamiseen tarvittavat parametritiedot ja DBMS-järjestelmän käyttöä varten asennettu ODBC tietokanta-ajuri (ODBC Driver). Tietokanta-ajuri muuntaa ODBC API:n funktiokutsut DBMS:n funktiokirjaston kutsuiksi ja suorittaa myös joitakin ODBC API:n kautta välitettyjen SQL-lauseiden muunnoksia DBMS:n SQL-murteelle. Native function Library: DBMS: Oracle Application ODBC API ODBC Driver Manager Oracle driver DB2 driver SQL Server driver Network - Formats and Protocols SQL DB2... Server (Windows registry) Data Source - Driver - server - protocols and formats ODBC-ajureita on nykyisin toteutettu lähes kaikille DBMSjärjestelmille. ODBC aloitti näin merkittävän avoimen tietokantaohjelmoinnin kehityksen romahduttaen aikaisempien kalleudellaan kehitystä hidastaneiden tietokantayhteyksien väliohjelmistojen tuotemarkkinat. Database: Kuva 2 ODBC OLE DB ja ADO C/C++ -kielille tarkoitetun ODBC API:n käyttö edellyttää laajan funktiokirjaston ja näiden funktioiden laajan parametriston käytön tuntemista. Microsoft kehitteli sen päälle erilaisia Visual Basic kielille sovitettuja wrapper-luokkakirjastoja kuten DAO ja RDO sekä C++ -olio-ohjelmointiin sopivan OLE DB luokkakirjaston, joka voi käyttää ODBC-yhteyksiä, mutta jolla voidaan DBMS-järjestelmäkohtaisten OLE DB Provider sovittimien avulla ODBC API:a tehokkaammin ja monipuolisemmin varsinkin Microsoftin oman SQL Server järjestelmän palveluita.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 6 ( 19) Visual Basic kielille OLE DB:n päälle Microsoft on kehittänyt helppoköyttöisen ActiveX Data Objects (ADO) luokkakirjaston, joka on kuvattu kuvassa 3. ADOohjelmoinnissa keskeisiä ovat seuraavat: - Connection olioluokka - Command olioluokka - Recordset olioluokka - Fields-kokoelma ja Field - Errors-kokoelma ja Error Yhteys tietokantaan luodaan Connection-olion Open-metodilla ja suljetaan lopuksi Close-metodilla. SQL-komentoja suoritetaan Command-olion Execute-metodilla, kun SQL-lause on ensin asetettu Command-olion CommandText-ominaisuuden arvoksi. SELECT-komento tuottaa Recordset-olion, jolla hallitaan SELECT-komennon tulosjoukkoa (result set). Recordset pitää yhtä tulosjoukon riviä currenttina Fieldskokoelmana, josta sarakenimellä indeksoiden voidaan osoittaa Field-olio ja sen getstring-metodilla tai sarakkeen tietotyyppiä vastaavalla get-metodilla voidaan lukea sarakkeen arvo kyseisellä rivillä. Tulosjoukkoa voidaan selata vaihtamalla currentin rivin osoitusta Recordsetin Move-metodeilla. Connection Errors Command Error Parameters Parameter Properties Recordset Property Fields Field Stream Record Kuva 3. ADO:n objektimalli lähde: David Sceppa, Programming ADO, Microsoft Press ADO on osa Microsoftin Distributed Network Architecture DNA-arkkitehtuurin Microsoft Data Access Controls (MDAC) komponentteja. Microsoftin uudessa Java-sovellusalusta kaltaisessa.net-arkkitehtuurissa ADO:n korvaa kehittyneempi ADO.NET luokkakirjasto.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 7 ( 19) Java JDBC Sunin Java-kielen tietokantaliittymäksi on rakennettu JDBC-spesifikaatio. Tämä on ADO:n kaltainen, mutta puhtaammin SQL-standardia toteuttava luokkakirjasto, jonka version 1 keskeiset rajapintaluokat ja näiden keskeiset metodit näkyvät kuvan 4 kaaviosta. DatabaseMetaData Driver... gettables( ) DriverManager Class getconnection (url, user, psw) Connection Statement ResultSet ResultSetMetaData getmetadata() setcursorname(s) getcolumncount() setautocommit(b) executequery(sql) getmetadata() getcolumnname(i) settransaction executeupdate(sql) findcolumn(name) getcolumnlabel(i) Isolation(level) cancel() next() getcolumndisplaysize(i) createstatement() close() getint(col) preparestatement(sql) getshort(col) preparecall(sql) getnumeric(col) PreparedStatement commit() getdouble(col) rollback() close() setxxxx(n, hvar) clearparameters() getfloat(col) getstring(col) getdate(col) gettime(col) gettimestamp(col) wasnull() settext(s) SQLException CallableStatement append(s) close() getsqlstate() registeroutputparameter geterrorcode() execute() getnextexcetion()... Kuva 4. JDBC 1:n rajapintaluokat ja keskeiset metodit Tätä kirjoitettaessa elämme tosin jo laajemman JDBC 3:n aikaa, mutta JDBC 1 riittää JDBC:n alkeisiin tutustumiseen. Verrattuna ADO:n luokkakirjastoon JDBC:n Statement vastaa ADO:n Commandoliota ja ResultSet ADO:n Recordset-oliota. ODBC:n tapaan JDBC:n sovituksen käytettävän DBMS-järjestelmän palveluihin tekee järjestelmäkohtainen JDBC-ajuri (Driver), jonka tulee löytyä Java-sovellusta ajettaessa CLASSPATH:n poluista. Esimerkki 1. Seuraava Sunin esimerkistä muokattu viittellinen Java-koodi havainnollistaa JDBC:n käyttöä: import java.sql.*; public class ReadResultSet { public static void main(string args[]) { String url = "jdbc:mysubprotocol:mydatasource"; Connection con; Statement stmt; try {

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 8 ( 19) Class.forName("myDriver.ClassName"); catch(java.lang.classnotfoundexception e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); try { con = DriverManager.getConnection(url, "mylogin", "mypassword"); stmt = con.createstatement(); ResultSet rs = stmt.executequery( "SELECT CoffeeName, Price FROM Coffees"); while (rs.next()) { String name = rs.getstring("coffeename"); float price = rs.getfloat("price"); System.out.println(name + " " + price); rs.close(); stmt.close(); con.close(); catch(sqlexception ex) { System.err.println("-----SQLException-----" + "\nsqlstate: " + ex.getsqlstate() + ", Message: " + ex.getmessage() + ", Vendor SQLcode: " + ex.geterrorcode()); Esimerkkiohjelma etsii Javan JRE\lib\ext hakemiston tai CLASSPATHin hakemistojen jar-tiedostoista ohjelman nimeämän JDBC-ajurin (mydriver.classname, katso taulukko 1), luo yhteyden url-muuttujan määrittämään tietokantapalvelimeen (mydatasource) käyttäen protokollaa mysubprotocol mylogin-käyttäjän nimissä tämän salasanalla. Taulukko 1. JDBC-ajureita DBMS JDBC-ajuri Oracle (Thin) oracle.jdbc.driver.oracledriver Solid solid.jdbc.soliddriver DB2 UDB COM.ibm.db2.jdbc.net.DB2Driver SQL Server URLin todellinen muoto merkkijonon jdbc: jälkeen riippuu käytettävästä JDBCajurista. Tästä on koottu esimerkkejä taulukkoon 2. Taulukko 2. URL-muotoja DBMS URL Oracle (Thin) jdbc:oracle:thin:@<server>:<portti>:<sid> Solid jdbc:solid://<server>:<portti> DB2 UDB jdbc:db2://<server>:<portti>/<dbname> SQL Server

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 9 ( 19) Huom: DB2:n net-ajuri edellyttää, että palvelimelle on käynnistetty DB2 Java Daemon prosessi. Käyttäen Statement-olion stmt executequery-metodia esimerkkisovelluksemme tekee SELECT-kyselyn tauluun Coffees saaden vastauksen ResultSet-olioon rs, listaa kaikki tulosjoukon rivit ja sulkee lopuksi oliot rs, stmt ja con. JDBC-käsittely tapahtuu oletusarvoisesti AutoCommit-moodissa ja tässä pienimuotoisessa esimerkissämme ei siis ole käytetty transaktionaalista tietokantakäsittelyä. SQLJ ja JDO Muita Javan tietokantakäsittelyyn kehitettyjä teknologioita ovat SQLJ ja JDO. SQLJohjelminnissa Java-ohjelmaan upotetaan ESQL:n tapaan SQL-lauseita, joista ennen varsinaista Java-käännöstä generoidaan SQLJ-esikääntäjällä vastaava JDBC-käsittely. JDO puolestaan on olio-ohjelmoinnin myös tietokantakäsittelyyn laajentava uusi teknologia. Näitä on kuvattu mm. Connollyn ja Beggin oppikirjassa Database Systems. Script-kielten tietokantaliittymiä ODBC:n menestyksen innostamana muutamiin yleisiin script-kieliin on myös rakennettu tietokantaliittymiä. Näistä melko laajassa käytössä ja esimerkiksi Oraclen tukemia ovat script-kielet Perl ja PHP. Näiden tietokantaliittymät ovat kuitenkin standardoimattomia ja ohitamme niiden kuvaukset. - - - Edellä kuvattuja data access teknologioita harjoitellaan Helian TIKO-2000 tietokantaohjelmointi-opintojaksolla.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 10 ( 19) Oraclen JDBC-toteutus Oracle on toteuttanut 2 client-työasemien JDBC-ajuria: OCI-ajurin ja Thin-ajurin. Molemmat tukevat hajautettuja transaktioita XA-protokollalla. OCI-ajuri tukee kaikkia Oraclen käyttämiä verkkoprotokollia ja edellyttää, että client-työasemaan on asennettu Oracle client-kirjastot. Thin-ajurin osalta riittää vain sen itsensä asennus työasemaan. Thin-ajuri sisältää SQL*Net valmiuden, tukee vain TCP/IP protokollaa ja edellyttää vain että palvelinpäässä on Oraclen TNS Listener. Oracle-tietokantaan voidaan tallettaa myös Java-luokkia, joita voidaan käyttää talletettujen PL/SQL-proseduurien ja funktioiden tapaan. Näitä varten Oracle on toteuttanut Thin-ajurin myös tietokantapalvelimessa, mutta ohitamme tämän kuvauksen. Tarkempia ohjeita Oraclen JDBC-ohjelmoinnista löydät Oraclen JDBC Developer s Guide and Reference käsikirjasta, jonka löydät Info9-palvelimen Oracle-manuals osoitteesta... Esimerkki 2: Oraclen JdbcTest-ohjelma Listataan Scott-käyttäjän EMP-taulun työntekijöiden sukunimet käsikirjasta löytyneellä JdbcTest-ohjelmalla (jota on hieman muutettu) import java.sql.*; class JdbcTest { public static void main (String args []) throws SQLException { String url = "jdbc:oracle:thin:@info9.helia.amk:1526:tux2"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); catch(java.lang.classnotfoundexception e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); System.exit(-1); // lopetus ajuriongelman vuoksi try { Connection con = DriverManager.getConnection(url,"testeri","psw"); // Query the employee names Statement stmt = con.createstatement (); ResultSet rset = stmt.executequery ( "SELECT ename FROM Scott.emp"); // Print the name out while (rset.next ()) { System.out.println (rset.getstring (1)); //close the result set, statement, and the connection rset.close();

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 11 ( 19) stmt.close(); con.close(); catch(sqlexception ex) { System.err.println("-----SQLException-----" + "\nsqlstate: " + ex.getsqlstate() + ", Message: " + ex.getmessage() + ", Vendor SQLcode: " + ex.geterrorcode()); Tallenna ohjelma JdbcTest.java nimisenä hakemistoon C:\Temp ja kopioi myös Oraclen Thin-ajuri classes12.jar hakemistoon C:\Temp Avaa Windowsin cmd.exe-ikkuna ja anna komennot C: CD Temp SET CLASSPATH=.;C:\Temp\classes12.jar Javac JdbcTest.java Java JdbcTest Esimerkki 3. Tilisiirto sarjallistuvuusongelmasta uusintayrityksillä selviytyvänä JDBC-transaktiona Tässä käytetään aikaisempaa transaktioharjoitusten Tilit- taulua ja sen sisältöä: CREATE TABLE Tilit ( Tilino INTEGER NOT NULL PRIMARY KEY, Saldo INTEGER NOT NULL ); INSERT INTO Tilit (Tilino,Saldo) VALUES (101202,10000); INSERT INTO Tilit (Tilino,Saldo) VALUES (220330,20000); COMMIT WORK; Esimerkissä sovelletaan SQL-oppikirjassani 1989 esittämääni vankan transaktion suunnittelumallia. Tuo COBOL-kieleen upotettu malli on nyt toteutettu Javaohjelmassa sarjallistuvuusongelman hallinnan suunnittelumallin testaamista varten. Tämän vuoksi tähän on ohjelmoitu tauko ensimmäiseltä tililtä noston jälkeen. /** * Helia, Martti Laiho 2005-11-29 * * Sarjallistuvuusongelmasta uusintayrityksillä selviävä Tilisiirtotransaktio */ import java.io.*; import java.sql.*; public class Tilisiirto2 { public static void main (String args[]) throws Exception {

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 12 ( 19) java.sql.connection conn = null; boolean jatketaanyrityksia = false; int counter = 0; String SQLState = "*****"; String errmsg = ""; int siirtosumma = 100; System.out.println("Tilisiirtotesti versio 1.0"); try { Class.forName("oracle.jdbc.driver.OracleDriver"); String scon = "jdbc:oracle:thin:@info9.helia.amk:1526:tux2"; conn = java.sql.drivermanager.getconnection(scon,"testeri","psw"); catch (Exception e) { System.out.println("** Tietokantayhteys ei avaudu: " + e.getmessage()); System.exit(-1); do { counter++; try { conn.setautocommit(false); // transaktio alkaa conn.settransactionisolation( Connection.TRANSACTION_SERIALIZABLE); errmsg = ""; jatketaanyrityksia = false; PreparedStatement pstmt1 = conn.preparestatement( "UPDATE Tilit SET saldo = saldo -? WHERE tilino =?"); pstmt1.setint(1, siirtosumma); pstmt1.setint(2, 101202); // miltä tililtä pstmt1.executeupdate(); // pause vain samanaikaisuuden testiä varten - odotetaan toisella // sovelluksella testattavaa ristiriitaista päivitystä System.out.print("\nJatka ENTER-nappaimella..."); BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); String s = reader.readline(); // pausen loppu PreparedStatement pstmt2 = conn.preparestatement( "UPDATE Tilit SET saldo = saldo +? WHERE tilino =?"); pstmt2.setint(1, siirtosumma); pstmt2.setint(2, 220330); // mille tilille pstmt2.executeupdate(); conn.commit(); pstmt1.close(); pstmt2.close();

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 13 ( 19) catch (SQLException ex) { try { errmsg = "\nsqlexception:"; while (ex!= null) { SQLState = ex.getsqlstate(); // tutkitaan onko sarjallistuvuusongelma if (SQLState.equals("40001") // Solid, SQL Server,... SQLState.equals("61000")) // Oracle jatketaanyrityksia = true; errmsg = errmsg + "SQLState: "+ SQLState; errmsg = errmsg + ", Message: "+ ex.getmessage(); errmsg = errmsg + ", Vendor: "+ ex.geterrorcode() + "\n"; ex = ex.getnextexception(); conn.rollback(); // println vain testiä varten System.out.println("** Tietokantavirheita: " + errmsg); if (jatketaanyrityksia) { long pause = (long) (Math.random () * 10000); // max 10 sek. System.out.println("Odotetaan "+pause+ " msekuntia"); // testiä Thread.sleep(pause); catch (Exception e) { // mahdolliset SQLException käsittelyn ongelmat conn.rollback(); ; // SQLException catch (Exception e) { conn.rollback(); ; // tähän muiden poikkeusten käsittely // muut exceptionit while (jatketaanyrityksia && counter < 10); // max 10 yritystä conn.close(); System.out.println("\n Ohjelman loppu. "); Testiajon käsikirjoitus on seuraava: 1. Käynnistetään ohjelma ja saadaan ilmoitukset: Tilisiirtotesti versio 1.0 Jatka ENTER-nappaimella... 2. SQLPlus-istunnosta on tehty ohjelman kanssa vastakkainen tilisiirto komennolla UPDATE Tilit SET saldo=saldo 200 WHERE tilino=220330; 3. jatketaan ohjelman suoritusta ENTER-näppäimellä. 4. SQLPlus-istunnosta annetaan komento UPDATE Tilit SET saldo=saldo + 200 WHERE tilino=101202;

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 14 ( 19) 5. Ohjelma tulostaa esimerkiksi seuraavaa ** Tietokantavirheita: SQLException:SQLState: 61000, Message: ORA-00060: deadlock detected while waiting for resource, Vendor: 60 Odotetaan 7671 msekuntia Jatka ENTER-nappaimella... 6. SQLPlus-istunnosta annetaan COMMIT tai ROLLBACK. Jos SQLPlus-istunnosta ei jatketa kilpailevia transaktioita, saa ohjelma tilisiirron suoritettua testiin ohjelmoidun odotusajan jälkeen. Esimerkin Java-ohjelma ei pyri olemaan täydellinen malli Java-ohjelmoinnista. Esimerkki näyttää kuitenkin JDBC-ohjelmoinnista mm. parametroitujen SQLkomentojen käytön, standardoidun SQLState-ilmaisimen käytön, jne. Monia tärkeitä JDBC-ohjelmoinnissa tarvittavia tekniikoita jää tässä pienessä esimerkissä esittelemättä, mm. SQL:n NULL-arvojen käsittely, SQL:n tietotyyppien ja Javan tietotyyppien vastaavuudet, aikatietojen käsittely ja SQL-murteiden sovitus JDBC:n escape-notaatioilla, jne. Vikasietoinen versio tästä transaktiomallista edellyttäisi tietokantayhteyksien avaamista jokaisella yrityskerralla. Näitä transaktioiden suunnittelumalleja tutkitaan tietokantaohjelmoinnin opintojaksolla tarkemmin.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 15 ( 19) Osa II Sovelluspalvelimet ja monikerrosarkkitehtuuri J2EE Sunin ja kumppaneiden määrittämä Java TM 2 Platform Enterprise Edition eli J2EE spesifikaatio määrittää Java-pohjaisen sovellusarkkitehtuurin (kuva 5), jonka takana ovat Microsoftia lukuunottamatta lähes kaikki ITC-alan keskeiset ohjelmistotoimittajat, mm. IBM ja Oracle, joilta on omat sovelluspalvelintoteutukset. Selain Web-palvelin Sovelluspalvelin Security Manager Transaction Manager Connection Pool Java-sovellus JDBC JDBC Tietokantapalvelin JDBC Kuva 5. J2EE-arkkitehtuuri lähde: Java TM 2 Platform Enterprise Edition Specification, v5.0 http://java.sun.com/j2ee J2EE-arkkitehtuurin mukaan tietokantakäsittely toteutetaan JDBC:llä Javasovelluksista (Client/Server), Web-komponenteista (servletit ja Java beanit) tai sovelluspalvelimeen asennettavista EJB-komponenteista. Sovelluspalvelimen Transaction Manager mahdollistaa transaktionaaliset EJB-komponenttien metodit, jotka voivat käyttää luotettavasti useaakin tietokantaa samassa globaalissa transaktiossa ja transaktio voi kattaa useankin komponentin metodin. Tietokantapalvelimet ovat tässä Resource Managereita, jotka hallitsevat kannassa toteutetut paikalliset transaktiot (local transaction) osana sovelluspalvelimen globaalia eli hajautettua transaktiota. Sovelluspalvelimen Transaction Manager toimii hajautetun transaktion koordinoijana neuvotellen transaktion Commit-operaatiosta transaktioon osallistuneiden Resource Managereiden kanssa ns. XA Two-Phase

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 16 ( 19) prokollalla (2PC), jossa transaktio perutaan globaalisti, jos yksikin paikallinen transaktio jäisi committoimatta. Tämä edellyttää, että tietokantayhteyksissä käytetyt JDBC-ajurit tukevat XA-protokollaa. JDBC:n tietokantayhteyden avaaminen on melko raskas operaatio. Tätä varten sovelluspalvelimen Connection Pool palvelu pitää varastossa valmiita fyysisiä tietokantayhteyksiä ja komponentin avatessa tietokantayhteyden avaaminen onkin vain looginen operaatio, jossa komponetti saa käyttöönsä jo valmiin tietokantayhteyden. Komponentin sulkiessa tietokantayhteyden tämä onkin looginen operaatio, jossa yhteyttä ei suljeta, vaan se siirretään uudelleenkäytettäväksi yhteysaltaaseen. Tämä mahdollistaa sovelluksen skaalautumisen palvelemaan laajempaa samanaikaista käyttäjäjoukkoa. EJB-komponentteja on kolmea erilaista tyyppiä, joiden tietokantakäsittelyn ohjelmointimallit poikkeavat toisistaan. Session Bean tyypeissä tietokantakäsittely toteutetaan JDBC:llä. Entity Bean tyypeistä on käytettävissä tietokantakäsittelyn osalta malli, jossa tietokantakäsittely ohelmoidaan itse, ja malli, jossa tietokantakäsittely hoidetaan sovelluspalvelimen Persistence Managerin toimesta automaattisesti. Ohitamme kuitenkin tällä erää tämän mielenkiitoisen aiheen. J2EE-arkkitehtuuria käsitellään tarkemmin Helian TIKO-2000 J2EEopintojaksolla.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 17 ( 19).NET, ADO.NET ja Client-Side XML Microsoftin uusi.net-arkkitehtuuri muistuttaa pitkälti Sunin J2EE-arkkitehtuuria ja näiden kehitys kulkeekin melkein tasajalkaa. Tietokantakäsittely toteutetaan.netarkkitehtuurissa ADO.NET luokkakirjastoilla, jota havainnollistaa viitteellisesti kuva 6. Client.NET Data Provider Generic objects with interfaces, versions depending on the Data Provider Object Array Object DataSet DataRelation Table X Table Y.ConnectionString.Open Transaction.BeginTransaction.Commit Connection.Rollback.Close Parameters.CreateCommand.ExecuteNonQuery Command.ExecuteScalar.CommandText.ExecuteReader.Read.Get<type> IDataReader DataReader DBMS DataAdapter XML XSD Kuva 6. ADO.NET:in client-side ja ADO.NET Data Providerien objektit JDBC:hen verrattuna mielenkiintoisia ratkaisuja ovat mm. Transaction-oliot, Command-olion erilaiset Execute-metodit, ResultSet-olioa vastaavan olion puuttuminen. ADO:n Recordset on korvattu toisaalta tulosjoukon forward-only tavalla purkavalla DataReader-oliolla ja toisaalta client-sovelluksen muistiavaruudessa toteutetulla varsinaiseen tietokantaan yhteydettömällä tietokantakopiolla DataSet, jossa voi olla useita paikallisia tauluja, näissä eheysrajoituksia ja näiden välillä eheyttä valvovia yhteyksiä. DataSetin käsittely ei ole SQL-pohjaista vaan navigoivaa. DataSetin rakenteet voidaan serialisoida WriteXmlSchema-metodilla XSD-tyyppiseen XML Schema tiedostoon ja rakenteet voidaan myös luoda ReadXmlSchemametodilla olemassaolevasta XSD-tiedostosta. Vastaavasti Datasetin tietosisältö voidaan serialisoida WriteXml-metodilla XML-tiedostoon ja lukea ReadXmlmetodilla XML-tiedostosta. DataSetista voidaan instantioida muistiin erillinen XmlDataDocument-tyyppinen DOM-puu, jota voidaan käsitellä XPath-kielellä ja XmlDataDocumentin tietosisältö voidaan synkronoida takaisin DataSetin tietosisällöksi.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 18 ( 19) Kuvan 6 kaaviosta puuttu mm. XmlReader-olio, jolla voidaan lukea suoraan tietokannasta tulevaa XML-virtaa..NET-arkkitehtuuria ja ADO.NET-ohjelmointia käsitellään tarkemmin Helian TIKO-2000.NET-opintojaksolla. - - - Web Services ja SOA Sekä J2EE että.net-arkkitehtuurit sisältävät Web Services palvelut, jossa palvelua käytetään XML-pohjaisilla alustariippumattomilla SOAP-sanomilla. Näin Web Services tarjoaa keinon integroida J2EE ja.net-pohjaisia järjestelmiä. Tästä palveluorientoituneesta sovellusarkkitehtuurista käytetään nimitystä SOA (Service Oriented Architecture). Sovelluspalvelinten lisäksi myös uudet Oracle ja SQL Server versiot mahdollistavat Web Service palvelun suoraan tietokantapalvelimesta.

HELIA TIKO-05 Sovellusarkkitehtuurit ja JDBC 19 ( 19) Harjoitukset (Tuntiharjoituksia opettajan johdolla) Huom. Käytä mieluimmin myy-palvelimella olevaa työhakemistoasi. Jos käytät paikallisen C-levyn työhakemistoa, niin muista poistaa ohjelmasi levyltä harjoituksen lopuksi, ettei ohjelmiin kirjoitetut käyttäjätunnuksesi joutuisi vääriin käsiin! Harjoitus 1. Kokeile tekstissä esitetyn esimerkki 2:n JdbcTest-ohjelmaa sellaisenaan. Info9:n TUX2-instanssissa on Scott-käyttäjällä EMP-taulu ja testeri-käyttäjällä lukuoikeus Scott-käyttäjän esimerkkitauluihin. Harjoitus 2. Sovella esimerkkiä 2 TUX1-instanssissa omalla tunnuksellasi oleviin Takkulan tauluihin kyselyyn 29: Minkä arvosanan kukin oppilas on eri kursseista saanut. Hae jokaiselle oppilaalle jokaisen suorituksen arvosana sekä aine- ja kurssitunnus ja aineen nimi. (Kaikilla oppilailla ei välttämättä ole arvosanoja, myös nämä tulostuvat). Lajittele oppilaan nimen mukaan..