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

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

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

Java ja tietokannan käsittely (JDBC)

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

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

Sovellusarkkitehtuurit

Tietokantaohjelmoinnin tekniikkoja Java-kielellä

Tietokannat II -kurssin harjoitustyö

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

Tietokannan webbikytkentä. Janne Petäjä

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

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

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Web Services tietokantaohjelmoinnin perusteet

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

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

Listarakenne (ArrayList-luokka)

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

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

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

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

5. HelloWorld-ohjelma 5.1

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

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

Microsoft Visual Studio 2005

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

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

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

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

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

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

TIETOKANNAT JOHDANTO

Java-kielen perusteet

HOJ J2EE & EJB & SOAP &...

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

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

5. HelloWorld-ohjelma 5.1

20. Javan omat luokat 20.1

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

Olio-ohjelmointi Javalla

Oracle-tietokanta. Riku Nykänen 1/2010

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

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

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

Java-kielen perusteet

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

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

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

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

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Mikä yhteyssuhde on?

1 Tehtävän kuvaus ja analysointi

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Visual Basic -sovelluskehitin Juha Vitikka

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

17. Javan omat luokat 17.1

Ohjelmoinnin perusteet Y Python

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

16. Javan omat luokat 16.1

YHTEYSSUHDE (assosiation)

MICROSOFT LINQ. Susanna Salonen

Microsoft Visual J++ ohjelmointiympäristö

HSMT J2EE & EJB & SOAP &...

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

1. Olio-ohjelmointi 1.1

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

EJB-komponenttien tietokantakytkentä

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

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

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Rajapinta (interface)

Object Framework - One. OF-1 is a high-productive Multi-UI OpenEdge data driven development framework. Veli-Matti Korhonen

Koira testissä vai Racci tuotannossa O10G/IAS10 Linuxilla

P e d a c o d e ohjelmointikoulutus verkossa

14. Poikkeukset 14.1

Helia Ohjelmointitaito Tuomas Kaipainen Mermit Business Applications Oy Mermit Business Applications

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmointi 2 / 2010 Välikoe / 26.3

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

15. Ohjelmoinnin tekniikkaa 15.1

7/20: Paketti kasassa ensimmäistä kertaa

1. Omat operaatiot 1.1

7. Oliot ja viitteet 7.1

Java-kielen perusteita

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

14. Poikkeukset 14.1

T Henkilökohtainen harjoitus: FASTAXON

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Transkriptio:

HELIA TIKO-05 Sovellusarkkitehtuurit 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. 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.

HELIA TIKO-05 Sovellusarkkitehtuurit 2 ( 19) 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).... #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) 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

HELIA TIKO-05 Sovellusarkkitehtuurit 3 ( 19) löytynyt yhtään riviä, negatiiviset arvot ovat virheitä ja positiiviset huomautuksia) tai SQLState-muuttujista, jonka arvot on standardoitu. Kuvassa 2 esitetään ESQL-ohjelman kehitysvaiheet. SQL-komennot testataan ensin SQL-editoria käyttäen. 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 2. ESQL-ohjelman kehitysvaiheet Testatut SQL-komennot upotetaan sovellusohjelman lähdekoodiin. Näin muodostettu ESQL-ohjelma käännetään ensin isäntäkielelle 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.

HELIA TIKO-05 Sovellusarkkitehtuurit 4 ( 19) 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ä. 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. Ks Kuva 3. Kuva 3 ODBC ODBC-ajureita on nykyisin toteutettu lähes kaikille DBMS-järjestelmille. ODBC aloitti näin merkittävän avoimen tietokantaohjelmoinnin kehityksen romahduttaen

HELIA TIKO-05 Sovellusarkkitehtuurit 5 ( 19) aikaisempien kalleudellaan kehitystä hidastaneiden tietokantayhteyksien väliohjelmistojen (middleware) markkinat. 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. Visual Basic kielille (joita ovat esim. Officen makrokielet) Microsoft on kehittänyt OLE DB:n päälle helppokäyttöisen ActiveX Data Objects (ADO) luokkakirjaston (Kuva 4), jonka- keskeisiä luokkia ovat seuraavat: - Connection olioluokka - Command olioluokka - Recordset olioluokka - Fields-kokoelma ja Field - Errors-kokoelma ja Error Connection Errors Command Error Parameters Parameter Properties Recordset Property Fields Field Stream Record Kuva 4 ADO-luokakirjasto 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 Fields-

HELIA TIKO-05 Sovellusarkkitehtuurit 6 ( 19) kokoelmana, 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. Seuraava ADO-esimerkki hakee SQL Serverille toteutetusta Takkula-tietokannasta Excelin työarkille "Keskiarvot" oppilasluettelon seuraavin tiedoin: oppilasnro, sukunimi,etunimi ja keskiarvo. Sub Keskiarvot() Dim adocon As ADODB.Connection Dim rs As ADODB.Recordset Dim strconnectstring As String Dim strsql As String Dim i As Integer On Error GoTo ConOpenError strconnectstring = "Provider=SQLOLEDB.1;" & _ "Integrated Security=SSPI;Persist Security Info=False;" & _ "Data Source=localhost;Database=Takkula;" Set adocon = New ADODB.Connection adocon.connectionstring = strconnectstring adocon.open Set rs = New ADODB.Recordset strsql = "SELECT oppilasnro,sukunimi,etunimi," & _ "AVG(arvosana) AS keskiarvo " & _ "FROM Oppilas JOIN Suoritus USING(oppilasnro) " & _ "GROUP BY sukunimi,etunimi,oppilasnro " & _ "ORDER BY sukunimi,etunimi,oppilasnro" rs.open strsql, adocon, adopenforwardonly, adlockreadonly i = 4 While rs.eof = False 'luetun rivin tietojen ladonta arkille "keskiarvot" Worksheets("keskiarvot").Cells(i, 1).Value = _.Fields("oppilasnro").Value Worksheets("keskiarvot").Cells(i, 2).Value = _.Fields("sukunimi").Value Worksheets("keskiarvot").Cells(i, 3).Value = _.Fields("etunimi").Value Worksheets("keskiarvot").Cells(i, 3).Value = _.Fields("keskiarvo").Value i = i + 1 rs.movenext Wend rs.close adocon.close Exit Sub Virhekasittely: Dim errobj As Object Dim strerrors As String For Each errobj In adocon.errors With errobj strerrors = strerrors & "[" &.Number & "] " & _.Description & _ ", NativeError=" &.NativeError & _ ", Source=" &.Source & _

HELIA TIKO-05 Sovellusarkkitehtuurit 7 ( 19) ", SQLSTATE=" &.SqlState & ". " End With Next MsgBox "Virhe: " & strerrors End Sub 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, josta kerrotaan myöhempänä. ADO.NETin jälkeen Microsoft on lanseeraamassa taas uutta isäntäkieliin (esim C#) integroituvaa tietokantaliittymää nimeltä "LINQ tosql".

HELIA TIKO-05 Sovellusarkkitehtuurit 8 ( 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 5. JDBC 1:n rajapintaluokat ja keskeiset metodit Tätä kirjoitettaessa elämme tosin jo laajemman JDBC 4: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 9 ( 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.jcc.db2driver SQL Server com.microsoft.sqlserver.jdbc.sqlserverdriver 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>:50000/<kanta> SQL Server jdbc:sqlserver://<server>;databasename=<kanta>

HELIA TIKO-05 Sovellusarkkitehtuurit 10 ( 19) 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. Esimerkkejä erilaisista tietokantaliittymistä löytyy RVV-artikkelin liiitteistä osoitteesta htp://www.dbtechnet.org/papers/rvv_paper.pdf. - - -

HELIA TIKO-05 Sovellusarkkitehtuurit 11 ( 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:1521:tux2"; try { Class.forName("oracle.jdbc.driver.OracleDriver"); catch(java.lang.classnotfoundexception e) { System.err.print("ClassNotFoundException: "); System.err.println(e.getMessage()); 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(); stmt.close(); con.close();

HELIA TIKO-05 Sovellusarkkitehtuurit 12 ( 19) 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 ojdbc14.jar hakemistoon C:\Temp Avaa Windowsin cmd.exe-ikkuna ja anna komennot C: CD Temp SET CLASSPATH=.;C:\Temp\ojdbc14.jar Javac JdbcTest.java Java JdbcTest Esimerkki 3. Tilisiirto sarjallistuvuusongelmasta uusintayrityksillä selviytyvänä JDBC-transaktiona 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. Kun esimerkiksi samanaikaisesta SQLPlus-istunnosta on tehty vastakkainen tilisiirto komennoilla UPDATE Tilit SET saldo = saldo 200 WHERE tilino = 220330; UPDATE Tilit SET saldo = saldo + 200 WHERE tilino = 101202; jatketaan ohjelman suoritusta ENTER-näppäimellä. /** * Helia, Martti Laiho 2005-11-29 * Sarjallistuvuusongelmasta uusintayrityksillä selviävä * Tilisiirtotransaktio */ import java.io.*; import java.sql.*; public class Tilisiirto { public static void main (String args[]) throws Exception { java.sql.connection conn = null; int counter = 0; String SQLState = "*****"; String errmsg = ""; boolean jatketaanyrityksia = false; int siirtosumma = 100; System.out.println("Tilisiirtotesti versio 1.0"); try { Class.forName("oracle.jdbc.driver.OracleDriver");

HELIA TIKO-05 Sovellusarkkitehtuurit 13 ( 19) String scon = "jdbc:oracle:thin:@info9.helia.amk:1526:tux1"; conn = java.sql.drivermanager.getconnection(scon,"user1","psw"); catch (Exception e) { System.out.println("Tietokantayhteys ei avaudu. errmsg=" + e.getmessage()); System.exit(-1); do { counter++; try { conn.setautocommit(false); // transaktio alkaa conn.settransactionisolation( Connection.TRANSACTION_READCOMMITTED); 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(); 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(); if (jatketaanyrityksia) { long pause = (long) (Math.random () * 10000); // max 10 sek. System.out.println("Odotetaan "+pause); // testiä Thread.sleep(pause); catch (Exception e) { // mahdolliset SQLException käsittelyn ongelmat conn.rollback(); ; // SQLException catch (Exception e) { conn.rollback();

HELIA TIKO-05 Sovellusarkkitehtuurit 14 ( 19) ; // tähän muiden poikkeusten käsittely // muut exceptionit while (jatketaanyrityksia && counter < 10); conn.close(); System.out.println("\n ohjelman loppu. " + errmsg); Esimerkki ei pyri olemaan täydellinen malli Java-ohjelmoinnista. Esimerkki näyttää kuitenkin JDBC-ohjelmoinnista mm. parametroitujen SQL-komentojen käytön, standardoidun SQLState-ilmaisimen käytön, jne. Monia tärkeitä JDBCohjelmoinnissa 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 escapenoaatioilla, jne. Vikasietoinen versio tästä transaktiomallista edellyttäisi tietokantayhteyksien avaamista jokaisella yrityskerralla. Näitä transaktioiden suunnittelumalleja tutkitaan tietokantaohjelmoinnin opintojaksolla tarkemmin.

HELIA TIKO-05 Sovellusarkkitehtuurit 15 ( 19) 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 6), 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 6. 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 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. J2EE-arkkitehtuurin nimeksi on vaihdettu JavaEE-arkkitehtuuri ja sitä on korjattu siten, että Entity Beanit on korvattu tavallisilla "persistenteillä" olioilla, joiden hakua ja talletusta tietokantaan hoitelee Java Persistence API:n (JPA) EntityManager-olio. Ohitamme kuitenkin tällä erää tämän mielenkiintoisen aiheen.

HELIA TIKO-05 Sovellusarkkitehtuurit 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 7. 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 7. 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 18 ( 19) Kuvan 6 kaaviosta puuttu mm. XmlReader-olio, jolla voidaan lukea suoraan tietokannasta tulevaa XML-virtaa. - - - 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 19 ( 19) Harjoitukset (Tuntiharjoituksia opettajan johdolla) 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.