EJB-komponenttien tietokantakytkentä

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

Java ja tietokannan käsittely (JDBC)

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

Tietokannat II -kurssin harjoitustyö

P e d a c o d e ohjelmointikoulutus verkossa

Tietokannat II -kurssin harjoitustyö

Java Platform, Enterprise Edition (Java EE)

Tietokantaohjelmoinnin tekniikkoja Java-kielellä

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

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

HOJ J2EE & EJB & SOAP &...

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmointi 2 / 2010 Välikoe / 26.3

Olio-ohjelmointi Javalla

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

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

HSMT J2EE & EJB & SOAP &...

Koira testissä vai Racci tuotannossa O10G/IAS10 Linuxilla

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

RDBMS - Yhteyskäytännöt

Helia Ohjelmointitaito Tuomas Kaipainen Mermit Business Applications Oy Mermit Business Applications

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

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

Tietojärjestelmä tuotantoympäristössä. Sovellusohjelmat Helsingin ammattikorkeakoulu Stadia / Tekniikka ja liikenne Vesa Ollikainen

Java-API, rajapinnat, poikkeukset, UML,...

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

Mikä yhteyssuhde on?

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

UML ja luokkien väliset suhteet

Projektinhallintaa paikkatiedon avulla

T Henkilökohtainen harjoitus: FASTAXON

Sovellusarkkitehtuurit

Action Request System

Ohjelmistojen mallintaminen, olioja relaatiomallinnuksen suhteesta

Ohjelmoinnin perusteet Y Python

1 Tehtävän kuvaus ja analysointi

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

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

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

Microsoft Visual Studio 2005

Tietokannan eheysrajoitteet ja niiden määrittäminen SQL-kielellä

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

Rajapinta (interface)

Ohjelmistoteknologioiden koulutus: Web-sovelluskehitys, Java Server. Infotilaisuus klo 10:00

Java kahdessa tunnissa. Jyry Suvilehto

Toisessa viikkoharjoituksessa on tavoitteena tutustua JUnit:lla testaukseen Eclipse-ympäristössä.

Web Services tietokantaohjelmoinnin perusteet

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

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

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

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

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

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

P e d a c o d e ohjelmointikoulutus verkossa

Järjestelmäkehitys EJB komponenttien avulla

A TIETORAKENTEET JA ALGORITMIT

9. Periytyminen Javassa 9.1

18. Abstraktit tietotyypit 18.1

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Java UI-komponentit (JTable) Juha Järvensivu 2007

Ylläpitodokumentti. Ohjelmistotuotantoprojektin tietojärjestelmä OhtuTie

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

FuturaPlan. Järjestelmävaatimukset

15. Ohjelmoinnin tekniikkaa 15.1

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

Tietorakenteet, laskuharjoitus 3, ratkaisuja

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

JAVA-OHJELMOINTI 3 op A274615

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmistojen mallintaminen, syksy 2011, laskuharjoitus 2

koodipolku iteraation muokkauksessa Dokumentti: koodipolkuesimerkki.doc Päiväys: Projekti : AgileElephant

Rinnakkaisohjelmointi, Syksy 2006

Ohjelmoinnin perusteet Y Python

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

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

JUnit ja EasyMock (TilaustenKäsittely)

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Arkkitehtuuri. Ylätason sovellusarkkitehtuuri

Metodien tekeminen Javalla

4. Olio-ohjelmoinista lyhyesti 4.1

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

Interaktiivinen tarinankerronta

Poikkeustenkäsittely

2. Olio-ohjelmoinista lyhyesti 2.1

KIURU Tietotekniikan sovellusprojekti

Listarakenne (ArrayList-luokka)

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmistotekniikan menetelmät, koe

Taulukot. Jukka Harju, Jukka Juslin

LINUX-HARJOITUS, MYSQL

Transkriptio:

hyväksymispäivä arvosana arvostelija EJB-komponenttien tietokantakytkentä Antti Harkola Helsinki 17. huhtikuuta 2003 Relaatiotietokannat nyt seminaari Helsingin yliopisto Tietojenkäsittelytieteen laitos

EJB-komponenttien tietokantakytkentä Antti Harkola Seminaari: Relaatiotietokannat nyt Tietojenkäsittelytieteen laitos Helsingin yliopisto 17. huhtikuuta 2003 sivumäärä 12 Tämä seminaaripaperi esittelee lyhyesti J2EE-arkkitehtuuria keskittyen sen tietokantakytkennän toteutuksen käsittelyyn. Lopuksi esitellään myös muutamia suorituskykyyn liittyviä testituloksia. Avainsanoja: J2EE, EJB, relaatiotietokanta, JDBC, SessionBean, EntityBean ii

Sisältö 1. Johdanto...1 2. J2EE-arkkitehtuuri...1 3. EJB-komponentit...2 3.1 Istuntopavut...3 3.1.1 Tilalliset istuntopavut...3 3.1.2 Tilattomat istuntopavut...4 3.2 Tietopavut...5 3.2.1 CMP...5 3.2.2 BMP...6 4. Suorituskyky...7 5. Yhteenveto...11 Lähteet...12 iii

1. Johdanto Tietokantayhteydet voidaan J2EE-ympäristössä (Java TM 2 Platform, Enterprise Edition) hoitaa usealla eri tavalla. Tämä esitys käsittelee tietokantayhteyksien hallintatavat EJBkomponenttien (enterprise java beans) ja servlettien avulla. EJB-komponentit jaetaan istuntopapuihin (session bean), tietopapuihin (entity bean) ja viestipapuihin (message-driven bean). Istuntopapujen ja servletien tietokantayhteys toteutetaan yleensä käyttäen JDBC:tä (Java Database Connectivity). Tietopavut voivat käyttää tietokantaa myös suoraan, jolloin ohjelmiston kehittäjä välttyy SQL:n kirjoittamiselta [J2T03]. Viestipapuja ei ole tarkoitettu tietokantayhteyksien käyttöön, joten niitä ei tässä seminaaripaperissa käsitellä. Aluksi käydään läpi muutamia J2EE:n perusasioita käsitteiden ja ympäristön ymmärtämiseksi. Seuraavaksi tutustutaan erilaisten EJB-komponenttien ominaisuuksiin ja niiden tapoihin käsitellä tietokantaa. Lopuksi tutustutaan kahden eri pro gradu tutkielman tuloksiin komponenttien tietokantayhteyksien suorituskyvystä. 2. J2EE-arkkitehtuuri J2EE on komponenttipohjainen teknologia suurien hajautettujen tietojärjestelmien suunnitteluun, kehitykseen ja toteuttamiseen. J2EE perustuu hajautettuun monitasoiseen (multitier) malliin, jossa järjestelmän eri osat voivat olla fyysisesti kaukanakin toisistaan. J2EE:n etuja ovat mm. alustariippumattomuus, komponenttien uudelleenkäytettävyys, sisäisen tiedon kuvaaminen XML:llä ja joustava transaktion hallinta [J2T03]. J2EE:n tasot erotetaan toisistaan seuraavasti: - Asiakastaso (client-tier) käsittää komponentit, joita ajetaan käyttäjän koneessa, esimerkiksi selainohjelma. 1

- Verkkotasoon (web-tier) kuuluvat sovelluspalvelimilla sijaitsevat komponentit, joita asiakas käyttää verkon kautta, yleensä lähinnä servletit, jsp-sivut, ym. käyttöliittymäelementit. - Liiketoimintatasolla (business-tier) olevat komponentit sijaitsevat myös sovelluspalvelimilla ja niiden tehtävänä on hoitaa järjestelmän toimintalogiikka. - Informaatiotasolla (Enterprise information system tier, EIS-tier) tarkoitetaan pysyvän tiedon tallennuspaikkoja, joita ovat lähinnä tietokantapalvelimet. 3. EJB-komponentit Kuvassa 1 on esitetty kuinka tieto kulkee tietokannan ja asiakkaan välillä. Servletit voivat käyttää tietokantaa myös itse JDBC:n avulla, mutta EJB-komponenttien käyttö helpottaa järjestelmän ylläpitoa ja lisää uudelleenkäytettävyyttä. Servlettien tulisi siis keskittyä tiedon esittämiseen (käyttöliittymä) kun taas EJB-komponentit hoitavat tietojen käsittelyn. Kuva 1. Sovelluslogiikka EJB-pavuissa [Ehr01] 2

EJB-komponentit toimivat säiliöissä (container). Säiliön asetuksilla määritellään mm. käyttöoikeudet ja transaktioiden käsittelysääntöjä. Myös JNDI-palvelut (Java Naming and Directory Interface TM ) saadaan säiliön kautta. Lisäksi säiliö huolehtii servlettien ja EJB-papujen elinkaaresta ja tietokantojen yhteysaltaista (connection pool). Seuraavaksi perehdytään tarkemmin istunto- ja tietopapuihin sekä tietokantayhteyden hallintaan niiden avulla. 3.1 Istuntopavut Istuntopapu kuvaa asiakasta J2EE-palvelimella. Käyttääkseen palvelimella sijaitsevia palveluja asiakas kutsuu istuntopavun metodeja. Istuntopapu on aina asiakaskohtainen, ei jaettu (shared). Se ei myöskään ole luonteeltaan pysyvä (persistent), sillä sen tietoja ei yleensä tallenneta mihinkään, kun asiakas lopettaa palveluiden käytön. 3.1.1 Tilalliset istuntopavut Istuntopapua sanotaan tilalliseksi (stateful), jos sen attribuutit sisältävät tietoja papua käyttävästä asiakkaasta. Muuttujien arvot kuvaavat käyttäjän ja pavun välistä tilaa, jota kutsutaan usein myös keskustelutilaksi (conversational state). Esimerkki tilallisesta istuntopavusta [J2T03]: public class CartBean implements SessionBean { String customerid; String customername; Vector contents; public void ejbcreate(string id, String name) throws CreateException { if (id == null) { throw new CreateException("Null id not allowed."); 3

else { customerid = id; customername = name; contents = new Vector(); public void addbook(string title) { contents.addelement(title); public void removebook(string title) throws BookException { boolean result = contents.removeelement(title); if (result == false) { throw new BookException(title + " not in cart."); public Vector getcontents() { return contents; public CartBean() { public void ejbremove() { public void ejbactivate() { public void ejbpassivate() { public void ejbload() { public void ejbstore() { public void setsessioncontext(sessioncontext sc) { 3.1.2 Tilattomat istuntopavut Tilattomat istuntopavut eroavat tilallisista siten, että niiden attribuutit eivät kuvaa tietyn asiakkaan ja istuntopavun välistä tilaa. Tilattomia istuntopapuja käytetään silloin, kun asiakkaan tyypillä ei ole väliä. Tilattomuuden ansiosta yhdellä istuntopavulla voidaan palvella useita 4

asiakkaita. Tyypillisesti tällaiset pavut ovat hyvin yksinkertaisia. Hyvä esimerkki voisi olla vaikkapa tietyn usein kysytyn tietokannan tiedon hakeminen kuten myyntiraportti tai hinnasto. 3.2 Tietopavut Toisin kuin istuntopavut tietopavut kuvaavat yleensä luonteeltaan pysyvää tietoa. Tyypillisesti yksi tietopapu kuvaa yhtä tietokannan taulua ja tietopavun instanssi yhtä taulun riviä. Kun tiedon käsittely lopetetaan, halutut muutokset tallennetaan tietokantaan ja tietopapu voidaan myöhemmin palauttaa sisällöltään samanlaisena. Koska tietopavut ovat pysyviä, niillä on oltava yksiselitteinen tunniste (primary key). Lisäksi tietopavut ovat jaettuja, eli niitä voi käyttää samanaikaisesti useampi asiakas. Niillä voi olla myös relaatioita toisiinsa, esim. tilaus ja tilausrivi [Rom01]. Tietopapujen pysyvyydestä voidaan huolehtia kahdella eri tavalla. Ohjelmistokehittäjä voi hoitaa asian itse, jolloin tiedon hakemiseen ja tallentamiseen liittyvät tietokantalauseet kirjoitetaan tietopavun metodeihin (Bean-Managed Persistence, BMP). Toinen tapa on antaa J2EE-palvelimen säiliön hoitaa samat asiat (Container-Managed Persistence, CMP) [J2T03]. 3.2.1 CMP Jos tiedon hakeminen ja tallentaminen jätetään J2EE-palvelimen vastuulle, ei tietopapuihin tarvitse kirjoittaa lainkaan SQL-lauseita, ja säiliö huolehtii myös tietopapujen relaatioista. Säiliö käyttää tietopapujen käsittelyyn säiliön konfiguraatiossa (deployment descriptor) kuvatun tiedoston (abstract schema) määrittelyjä. Nämä määrittelyt kirjoitetaan käyttäen hyvin SQL:n kaltaista EJB QL (Enterprise JavaBeans Query Language) kieltä. Suurin hyöty tällaisista tietopavuista on ohjelmiston siirrettävyys ja tietopapujen uudelleenkäytettävyys. Samat komponentit toimivat suoraan eri valmistajien tietokantojen päällä ilman että koodiin tarvitsee tehdä lisäyksiä tai muutoksia. Lisäksi papujen koodi on lyhyempää ja selkeämpää. 5

3.2.2 BMP Toinen vaihtoehto on hoitaa tietokannan käsittely kokonaan itse. Ensin tarvitaan tietokantayhteys, joka saadaan JNDI:n avulla seuraavasti [J2T03, J2E03]: private String dbname = "java:comp/env/jdbc/databasename"; InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup(dbname); java.sql.connection con = ds.getconnection(); Connection-olion kautta voidaan suorittaa tietokantaoperaatioita käyttäen JDBC-yhteyksistä tuttuja metodeja. Seuraava lista kertoo, mitä tietokantaa käsitteleviä metodeja EJB-pavulla on ja mitä ne tekevät: - ejbcreate() luo pavun tietokantaan, alustaa muuttujat, palauttaa tunnisteen - ejbpostcreate() suoritetaan heti ejbcreaten jälkeen, usein tyhjä - ejbremove() poistaa pavun kuvaaman tiedon tietokannasta - ejbload() hakee pavun esittämän tiedon tietokannasta - ejbstore() tallentaa pavun sisällön tietokantaan - ejbfindbyprimarykey() hakee pavun tunnisteen avulla Esimerkiksi ejbcreate() -metodi voisi olla seuraavanlainen: public String ejbcreate(string id, String name) throws CreateException { if (id == null) { throw new CreateException ("A null value for id is not allowed."); 6

try { insertrow(id, name); // Accessing database here catch (Exception ex) { throw new EJBException("ejbCreate: " + ex.getmessage()); this.id = id; this.name = name; return id; InsertRow()-metodissa otetaan yhteys tietokantaan ja java.sql.connection-olion metodeja käyttäen luodaan uusi rivi tietokantaan ja suljetaan yhteys [J2S03]. Pavut saadaan kotirajapinnan (Home Interface) kautta. Seuraava esimerkki näyttää kuinka SavingsAccountHome-rajapinnan kautta saadaan SavingsAccount-papuja [J2T03]: public interface SavingsAccountHome extends EJBHome { public SavingsAccount create(string id, String firstname, String lastname, BigDecimal balance) throws RemoteException, CreateException; public SavingsAccount findbyprimarykey(string id) throws FinderException, RemoteException; 4. Suorituskyky Tässä kappaleessa perehdytään kahden eri pro gradu tutkielman tuloksiin J2EE-ympäristön komponenttien tietokantayhteyksien suorituskyvystä. Ensimmäiset tulokset on poimittu Ehrlundin tutkielmasta [Ehr01]. Tutkielmassa mitattiin suorituskykyä sekä pienellä että suurella 7

taulun tietomäärällä. Tässä esitetyt tulokset on saatu suuriin tauluihin tehdyillä operaatioilla. Transaktioiden mahdollista käyttöä tai niiden vaikutusta ei otettu testissä huomioon, mikä on saattanut vaikuttaa tuloksiin. Listaus 100 riviä: tapa aika (ms) Istuntopapu 4100-4400 CMP 20790 BMP 35885 Servlet 18688 Haku 10 riviä: tapa aika (ms) Istuntopapu 2069-2196 CMP 5595 BMP 4064 Servlet 3391 Päivitys 10 riviä: tapa aika (ms) Istuntopapu 3444-3545 CMP 5752 BMP 4463 Servlet 6262 8

Päivitys kahteen tauluun: tapa aika (ms) Istuntopapu 935-1103 CMP 34382 BMP 36443 Servlet 3532 Lisäys 10 riviä: tapa aika (ms) Istuntopapu 1539-1759 CMP 1663 BMP 1717 Servlet 3092 Poisto 10 riviä: tapa aika (ms) Istuntopapu 2255-2341 CMP 2222 BMP 2313 Servlet 3921 Saaduista tuloksista voidaan tehdä ainakin se johtopäätös, että istuntopapujen käyttö on keskimäärin nopeampaa kuin muiden tapojen käyttäminen. Istuntopavut eivät vaikuttaisi koskaan olevan selvästi muita tapoja hitaampia, kun taas kahteen eri tauluun kohdistunut päivitys on tietopavuilla jopa 10-30 kertaa muita tapoja hitaampaa. Katajanheimon pro gradu tutkielmassa [Kat02] saatiin samansuuntaisia tuloksia. Tietopapujen ajoittainen heikko suorituskyky näyttäisi jopa entisestään korostuvan. Toisaalta tietopapujen keskinäiset erot näyttävät muuttuneen, minkä voisi selittää paremmin toteutetut 9

SQL-lauseet tai erot transaktion hallinnassa. Katajanheimo ei tutkinut eroa istuntopavuilla ja servleteillä tehtyjen JDBC-toteutusten välillä, mutta otti lisävertailukohteeksi PL/SQL:n. Lisäksi mukana on suhdeluku, joka määrittää mittaustulokselle kertoimen verrattuna nopeimpaan mittaustulokseen. Lisäys: tapa aika (ms) suhdeluku JDBC 6,1 1,00 CMP 7,5 1,24 BMP 8,8 1,46 PL/SQL 11,0 1,82 Päivitys: tapa aika (ms) suhdeluku JDBC 5,9 1,00 CMP 18,9 3,19 BMP 14,3 2,41 PL/SQL 8,3 1,40 Joukon päivitys: tapa aika (ms) suhdeluku JDBC 377, 6 1,00 CMP 4748,5 12,58 BMP 4584,0 12,14 PL/SQL 483,8 1,28 10

Haku: tapa aika (ms) suhdeluku JDBC 6,0 1,00 CMP 250,1 41,62 BMP 175,9 34,48 PL/SQL 12,5 2,07 Näiden tutkimustulosten perusteella ohjelmistokehittäjien on tarkasti harkittava mitä toteutustapaa käyttää, jos suorituskyvyllä on suuri merkitys. Vaikka J2EE-arkkitehtuurissa suositellaankin yleensä käytettäväksi tietopapuja tietokantayhteyksien toteuttamiseen, näyttäisivät istuntopavut tai jopa suora yhteys servletistä käsin olevan suorituskyvyn kannalta yhtä hyvä tai parempi vaihtoehto. 5. Yhteenveto J2EE:n tietokantakytkentä voidaan toteuttaa käyttämällä EJB-komponentteja tai suoraan servleteillä. Tietokantoja käsittelevät EJB-komponentit voidaan jakaa istuntopapuihin ja tietopapuihin. Istuntopavut eivät ole pysyviä ja edustavat yleensä jotain asiakkaan toimintoa. Tietopavut ovat pysyviä ja ne kuvaavat yleensä tietokannan tauluja. Tietopavun instanssi puolestaan kuvaa tietokannan riviä. Tietopapu voidaan toteuttaa käyttämättä SQL:ää, jolloin komponenttien siirrettävyys ja uudelleenkäyttö on helpompaa. Vaikka tietopavut on ensisijaisesti tarkoitettu tietokantojen käsittelyyn niiden suorituskyky on suurilla tietomäärillä selvästi huonompi kuin istuntopapujen tai servletien. Suorituskykyyn voivat tosin vaikuttaa transaktion hallinta, kyselyiden toteutus ja käytetyn tietokantapalvelimen tyyppi. 11

Lähteet [Ehr01] Ehrlund Sampo, pro gradu -tutkielma: Tietokannan käsittelytavan vaikutus ohjelmiston suorituskykyyn J2EE-ympäristössä, 17.10.2001 [Kat02] Katajanheimo Tero, pro gradu -tutkielma: Sovelluspalvelimen ja relaatiotietokannan välinen kommunikointi, 7.4.2002 [Rom01] Roman, E., Mastering Enterprise JavaBeans TM and the Java 2 Platform, 2 nd Edition, John Wiley & Sons Inc, 2001 [J2T03] J2EE-tutorial: http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/j2eetutorialtoc.html, 15.4.2003. [J2E03] Java TM 2 Platform Enterprise Edition, v 1.4 API Specification: http://java.sun.com/j2ee/1.4/docs/api/, 15.4.2003. [J2S03] Java TM 2 Platform, Standard Edition, v 1.4.1 API Specification: http://java.sun.com/j2se/1.4.1/docs/api/, 16.4.2003. 12