Jos o funkciji LEN

Monday, 14.09.2009 – Zidar

 

 

Ovoga puta nesto lepo. Verujem da isto radi na svim sistemima.  Ovako je pitanje: odrediti broj pojava nekog karaktera ili grupe karaktera unutar datog stringa. Na primer, koliko ima zareza u stringu ‘a,b,c,d,e,f’’ ?

 

DECLARE @Niz AS varchar(1000)

SET @Niz = ‘a,b,c,d,e,f,g’

 

— Koliko zareza ima u varijabli @Niz?

SELECT LEN(@Niz) LEN(REPLACE(@Niz,‘,’,))

Ovo bi moglo biti korisno kada saljete niz procedure, pa onda procedura taj niz treba da insertuje u tabelu….

 

Posto je i razmak znak, tako je i kratak blog-entry ipak blog-entry.

 

J

 


MS SQL: Da li je razmak punopravan znak?

Wednesday, 09.09.2009 – Zidar

Svi SQL sistemi i programski jezici imaju funkciju za izracunavanje duzine stringa. U MS SQL tu ulogu ima funkcija LEN. Valjda i najveci pocetnik zna da izvrsi ovo:

SELECT LEN('abc')

i dobije rezultat 3.  Hajde da prosirimo string ‘abc’, ovako:

SELECT LEN('abc        x')

Rezultat je 12.  Ako odbacimo ‘x’ na kraju, ja bih ocekivao da dobijem duzimu 11. I razmaci su karakteri, inace bi ih funkcija LEN zanemarila u prethodnom primeru, zar ne? Pokusajmo dakle ovo:

SELECT LEN('abc        ')

Ooops, rezultat je 3.  A ocekivali smo 11. Trk u Books On line, da vidimo sta pise, kad ono – nista. Nema ni pomena da se LEN ovako ponasa. OK, mozad se to smatra za opste poznatu stvar, jer u nekim drugim sistemima se LEN ponasa slicno.  Ja doduse ne poznajem druge sistem toliko detljno.  Jedini database sistem koji poznajem bolje nego MS SQL je Access. I gle cuda, u Accesu LEN ne zanemaruje razmake na kraju stringa.

Dobro, prihvatimo realnost, MS SQL zanemaruje razmake na kraju stringa u funkciji LEN. Kako onda da dobijem, pravu duzinu stringa? Moze na vise nacina. Nacin prvi: dodati neki znak na string kome racunamo duzinu, pa od rezultat oduzeti 1. Ovako nekako:

SELECT LEN('abc        '+'X') - 1

Radi. Vraca rezultat 11. Lepo, ali ko ce se toga setiti bas svaki put…. Zato postoji diraktan nacin – upotreba funkcije DATALENGTH. Nisam siguran da je ova funkcija po SQL standardu, ali nema veze, vrsi posao:

SELECT DATALENGTH('abc        ')

Dobili smo tacan rezultat – 11. Ipak, pre nego sto u glavi zacrtamo ‘Ne koristi LEN nikada, umesto LEN koristi DATALENGTH, i nemaj drugog Boga osim toga’, razumno je pretpostaviti da je DATLENGTH skuplja za izvrsavanje nego LEN, sto u nekim kverijima moze biti od znacaja.

O, i jos jedna stvar na kraju. Razmaci na pocetku stringa se uzimaju u obzir, LEN ih ne zanemaruje. Ko zeli, moze da proba i uveri se sam.

Naravoucenije: za MS SQL razmak je gradjanin nizeg reda, pa se ponekad zanemaruje. Medjutim, kao i svuda, ako s egradjanin nizeg reda postavi na neku vodecu poziciju, sitem pocinje da ga uvazava. MS Access je znaci vise naklonjen univerzalnoj jendakosti, bar kad je funkcija LEN u pitanju, pa razmake tretira kao i sve druge znakove, bez zizuzetka, bez obzira na poziciju.

Kad je  MICROSFT u pitnju sve je moguce.

🙂


Recenzija knjige: Linux Recipes for Oracle DBAs

Saturday, 05.09.2009 – Dejan

Nakon kraće ljetne pauze u čitanju stručne Oracle literature nastavljam u revijalnom tonu sa novom recenzijom (da! na godišnji odmor nisam ponio niti jednu Oracle knjigu!! :)).

Ovaj put je na red došla izvanredna knjiga, koja opisuje simbiozu Oraclea i Linuxa – “Linux Recipes for Oracle DBAs“, čiji autori su Darl Kuhn, Charles Kim i Bernard Lopuz.

Ja sam lično prvo “production” iskustvo sa Oracle bazom imao na platformi IBM AIX, a zadnje 3-4 godine sam u kontaktu isključivo sa Windows platformom, tako da sam malo zahrđao na području Linuxa/Unixa. Međutim, zbog trenutne restrukture u firmi, koja obuhvata i migraciju nekoliko Oracle baza na IBM AIX platformu, prinuđen sam da opet aktivnije zaplivam u Linux/Unix vode.


Odabrao sam ovu knjigu, jer sam od nekoliko osoba čuo da sadrži mnogo konkretnih “real-world” slučajeva po principu “problem – rješenje”, odnosno “pitanje – odgovor”. Kratki opis na prvoj korici knjige odlično predstavlja kompletan sadržaj knjige: “Real-world solutions for the interesection of Linux and Oracle technologies“. Meni ti kratki i praktični savjeti  odlično odgovaraju, jer nemam želju, niti vremena da čitam knjige sa opširnim objašnjenjima šta čemu služi i kako se koriste pojedine Linux komande.

Pored osnovnih banalnih stvari, npr. kako se logovati na Linux server ili kako izlistati sadržaj nekog direktorija ili datoteke, navedeno je mnoštvo praktičnih primjera kako:
– podesiti shell i pisati shell skripte
– upravljati Linux procesima
– kreirati i podesiti korisničke naloge i grupe, potrebne za instalaciju i administracije Oracle softwarea
– kreirati direktorije i datoteke, te kako editovati neku datoteku koristeći vi editor
– analizirati i konfigurisati sistemske resurse (CPU, I/O, memoriju i td.)
– implementirati Oracle ASM i Oracle RAC na Linuxu
i td.

Saznao sam i da Oracle nudi nekoliko dodatnih alata zastupljenih na Linuxu, ali ne i na Windowsu (npr. OS Watcher). Naučio sam i kako se koristi cron za podešavanje automatskog izvršavanja neke operacije, zatim kako koristiti screen i mnogo drugih jednostavnijih, a korisnih savjeta.

Na zadnjoj korici knjige piše “User Level: Beginner-Intermediate“, što daje ohrabrenje onima bez velikog iskustva sa Linuxom – npr.  meni. 🙂

Dakle, nakon čitanja ove knjige, mogu slobodno reći, da bih se mogao bez ikakvog straha spojiti na bilo koji Linux server i obavljati administraciju Oracle baze na njemu.

Plašim se jedino da se koristeći Linux i konzolni text terminal ne odviknem od korištenja miša. 🙂

Ocjena: 10/10


Oracle 11gR2 vani – spremno čeka svoju šansu u produkciji! :)

Wednesday, 02.09.2009 – msutic

Iako sam ovu vijest već vidio na mnogo blogova ne bi bilo u redu da se zaobiđe ovaj blog.

Što reći, Oracle 11gR2 možete skinuti na stranicama OTN-a – skidaj i trenutno je dostupna samo verzija za Linux.

Više informacija o tome što nam 11gR2 nudi možete pogledati u dokumentaciji.

Sad se čeka verzija Solaris OS i onda 11-cu lagano puštamo u produkciju.

Neka testiranje počne 🙂


Ispiti za Oracle sertifikate se više neće polagati preko Prometrica

Tuesday, 01.09.2009 – Dejan

Tek danas naletih na informaciju, da se ispiti za sve Oracle sertifikate neće više moći polagati u Prometric testnim centrima, nego je Oracle našao novog partnera – Pearson VUE.

Navodno će za sve kandidate prelazak sa Prometrica na Pearson VUE biti transparentan i moći će se i dalje u novom sistemu koristiti trenutni testing ID od Prometrica. Sve informacije o prethodnim ispitima i sertifikatima će biti sačuvane i prenesene u novi sistem.

Usput se ukida dosadašnji “Hands On Course Requirement Forms” sistem i uvodi se novi sistem pod nazivom “Course Submission”. Da li je to samo novi naziv ili će se nešto bitno promijeniti, vidjeće se uskoro.

Više informacija možete pročitati u službenoj obavijesti:
http://www.oracle.com/global/us/education/certification/exam_vendor.html


Records and Collections – Part I

Thursday, 27.08.2009 – Noctua4u

Često u programerskim razgovorima dođe do nesporazuma oko nekih stvari koje postoje svuda (i u razvojnim jezicima i u bazama), koje se ponašaju na istovetan ili približno istovetan način, ali se nazivaju drugačije.

Jedan od najčešćih kamena spoticanja u razgovorima, a ne retko i u realizaciji, je struktura podataka poznata kao…  Hm, u programskim jezicima se sreće kao RecordSet, Sets, Bags, Lookup tables, Arrays, Records…

Za početak, definisaćemo šta je šta, čemu služi, kako izgleda, i upoznaćemo se sa osnovnim pojmovima.

Stalna praksa je prenos podataka na relaciji DB – KLIJENT. Dvosmerno. (Pod KLIJENT podrazumevam bilo koji programski jezik, aplikaciju, skript… bilo šta što pristupa i koristi bazu).

U većem broju slučajeva, mnogo toga se može završiti jednostavnim pozivom procedura/funcija. Vi ih pozovete, one vam vrate rezultat (ili nešto odrade pa vrate rezultat).
Lepo i jednostavno.
Ali šta raditi kada je KLIJENTU potrebno mnogo rezultata? Logično rešenje je proslediti sve tražene podatke.
Kako? Pomoću recordseta.

Da bi koristili recordset, potrebno je “napraviti” novi tip podataka koji predstavlja strukturu informacija koje prenosite tj, sa kojima radite.

Kod Oracle-a, u te svrhe postoje PL/SQL collections i Records:

  • Kolekcija (Collection – Zbirka, kolekcija) je uređena grupa podataka ISTOG tipa.
  • Record (Record – Zapis, slog) je grupa podataka, pri čemu svaki podatak ima svoje IME i svoj TIP.

Pri čemu Kolekcije mogu da budu:

  • Associative arrays (asocijativni nizovi) –  Sadrže proizvoljan broj elemenata kojima se pristupa brojem ili imenom. Možemo reći da je to skup Ključ-Vrednost parova pri čemu je svaki Ključ jedinstven i koristi se da bi se dobila Vrednost (npr: mojNiz(“prvi_element”) := 1 ili mojNiz(1) := 1).
    Kod Oracle-a ova struktura podataka je poznatijia kao “index-by tables” dok su u drugim programskim jezicima poznatiji (a i po funkcionalnosti približniji) kao “hash tables“.
  • Nested tables (ugnježdene tabele) – Sadrže proizvoljan broj elemenata sekvencionalno numerisanih. Element može da bude bilo koji tip (Number, Varchar, Record, PL/SQL Type…).
  • Varrays (variable-size arrays) – Sadrže fiksan broj elemenata sekvencionalno numerisanih.

Record je tip podataka koji se sastoji od grupe polja. Slično kolonama u redu tabele. Kao što je ranije pomenuto, svako polje ima sve ime i svoj tip. Moguće je koristiti %ROWTYPE za deklaraciju PL/SQL record-a koji predstavlja red fizičke tabele u bazi a moguće je i pobrojati potrebne kolone.

Iako su kolekcije/record jednodimenzionalni tipovi podataka, moguće je kreirati višedimenzionalnu strukturu praveći kolekciju čiji su elemenati takođe kolekcije.

Moguće je kreirati i koristiti ih kako na globalnom nivou (na nivou DB, pri čemu se prava korišćenja novo kreiranog tipa/kolekcije dodeljuju na identičan način korisnicima/rolama kao i prava korišćenja tabela ili bilo kog drugog baznog objekta) tako i na lokalnom nivou (u okviru paketa, procedure, funkcije… pri čemu se kreiraju, inicijalizuju i koriste dok se izvršava procedura/funkcija).
Takođe, moguće je prosleđivati ih kako u/iz procedura i funkcija tako i van DB, ka klijentu.

Teorijska, globalna analogija sa postojećim programskim jezicima bi bila:

  • Arrays (u drugim jezicima) < = > Varrays u PL/SQL
  • Set, RecordSet, Record < = > Nested Tables
  • Hash tables, Lookup tables < = > Associative Arrays
  • RecordSet < = > Record

Zašto “teorijska” i zašto se pojedine stvari ponavljaju?
Jednostavno, moguće je, u zavisnosti od potreba, prikazivati strukture na različite načine.

Neke osobine i svojstva kolekcija:

  • Nested tables
    – Mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
    – Vrednosti indexa (Misli se na Ključ) ne moraju da budu uzastopne
    – Inicijalno nepoznat broj elemenata i njihova vrednost
    – Promena samo nad pojedinim elementima (Update, Delete)
    – Nakon smeštanja u bazu, redosled elemenata ne mora da bude sačuvan (tj. indeksi/ključevi kojima su indeksirani elementi ne moraju da budu sekvencionalni, naročito posle izvesnih operacija)
  • Varrays
    – Mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
    – Elementi su, obično, svi sekvencionalno ustrojeni.
    – Unapred poznat broj elemenata i njihove vrednost
    – Promena nad svim elementima istovremeno (naročito pogodno za masovan UPDATE)
    – Nakon smeštanja u bazu, sačuvan je redosled.
  • Associative Arrays
    – NE mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
    – Inicijalno nepoznat broj elemenata i njihova vrednost.
    – Redosled elemenata nije bitan jer im se pristupa po Ključu.
    – Pogodni za relativno mali broj podataka koji se prikupljaju i inicijalizuju u memoriji svaki put kada se pozove procedura/funkcija

Kao zaključak prvog dela, bilo bi poželjno uočiti i upamtiti suštinsku razliku: Kolekcije su grupa podataka ISTOG tipa, a Record je grupa podataka RAZLIČITOG tipa.
Takođe, razlike u kolekcijama su u broju elemenata (poznat, nepoznat), redosledu elemenata (promenljiv i ne narušava se) i načinu pristupa elementima (po imenu ili po poziciji).

U “sledećem broju” malo tehničkih karakteristika, kreiranje, inicijalizacija i korišćenje.


Recenzija knjige: “Beginning Oracle Database 11g Administration”, Iggy Fernandez

Saturday, 22.08.2009 – msutic

Ukoliko redovito čitate tekstove na ovom blogu, jasno se može vidjeti da ima podosta sadržaja vezanog za tematiku administracije Oracle baza podatka. Možda baš radi tih tekstova odlučite i sami postati db administrator, iako se time niste bavili nikada. Moj vam je savjet da se bez straha upustite u tu avanturu, jer iako se možda posao db administratora čini vrlo kompliciranim, postoje mnoge knjige i članci koji će vam posao učenja maksimalno olakšati.

Jedna od takvih knjiga je i knjiga “Beginning Oracle Database 11g Administration” (Iggy Fernandez).

Neka vas ne zavara naslov u kojem piše 11g. Znanje koje možete dobiti čitajući ovu knjigu je primjenjivo gotovo na sve aktualne verzije Oracle baza podataka.

Dosta uvoda, sad malo detaljnija recenzija.
Prvo što mogu reći za ovu knjigu je da je ovo odlična knjiga za svakog db administratora početnika. Iggy Fernandez je odličan pisac, te je sposoban na vrlo jednostavan način u kratkim crtama objasniti bitne stvari. Sama knjiga nema puno stranica, te je očito da se kroz poglavlja ne ulazi previše u detalje što je odlično za početnike koji ionako te detalje vjerojatno ne bi razumjeli bez radnog iskustva.

Iza svakog poglavlja se nalazi popis knjiga u kojim se može naći nešto više informacija o toj temi za one koji žele znati više. Kroz taj popis Iggy ljude usmjerava na super knjige, te početnici neće morati gubiti dragocjeno vrijeme tražeći dobre knjige u moru informacija. Uz to, Iggy često daje vlastite vrijedne savjete sakupljene iz osobnog radnog iskustva administratora Oracle baza podataka koji mogu biti od iznimne važnosti početnicima.

Knjiga je odlično organizirana stoga vam preporučam da ju čitate od korice do korice, bez preskakivanja tema.

Podijeljena je na četiri dijela:
– Database Concepts
– Database Implementation
– Database Support
– Database Tuning

– Database Concepts
Ovo je poglavlje zanimljivo zbog toga što Iggy u njemu počinje sa objašnjavanjem najosnovnijih, ali jako bitnih, stvari vezanih za baze podataka. Tu ćete naučiti što je baza podataka, a što je zapravo RDBMS (Relational Database Management Systems),te gdje tu možemo svrstati Oracle. Fino je opisano na koji način aplikacije komuniciraju sa bazom podataka, te kratak opis internog mehanizma Oracle RDBMS-a.

– Database Implementation
Ovdje je fino opisano na koji način se ISPRAVNO prvodi implementacija baze podataka. Važno je za razumjeti da za kreiranje baze podataka u produkciji nije dovoljno samo pratiti osnovne “Wizarde” ili izvršiti “CREATE DATABASE” naredbu. Bitno je prije svega planiranje fizičkog i logičkog dizajna kao i mnoge druge stvari na koje se Iggy osvrće kroz cijelo poglavlje.

– Database Support
U ovom poglavlju je fino opisan svakodnevni posao jednog administratora baza podataka. Vrlo je važno za razumjeti da je primarna obaveza jednog db administratora omogućiti da baza zadovolji sve zahtjeve “business”-a. Opisano je zašto je najvažnija obaveza svakog administratora redovito praviti sigurnosne pohrane podataka i biti vješt u vraćanju tih podataka u slučaju katastrofe. Zanimljivo je da ovdje Iggy iznosi neka vlastita iskustva, “Horor priče” kako ih sam naziva, kada su stvari pošle po zlu baš radi loše sigurnosne pohrane podataka.
O ovom se djelu nalazi i najvažnije poglavlje po njemu “The Big Picture and the Ten Deliverables” gdje Iggy navodi kakva je uloga administratora baza podatka u nekom poslovanju tvrtke, tj. u koji sektor bi se on mogao svrstati. Naglasak je stavljen na činjenicu da je vrlo bitno poznavati poslovanje kompanije i znati kakva je vaša uloga u svemu tome. U svakom slučaju VRLO zanimljivo poglavlje koje (po meni) morate pročitati i razumjeti.

– Database Tunning
I za kraj, ovo je po meni i najmanje zanimljivo poglavlje, ali ipak daje početnicima neku grubu sliku o tome kako se izvršava podešavanje raznih svojstava Oracle RDBMS-a ili podešavanje SQL upita. Kroz primjere je opisan proces podešavanja, te bi preporučio da korake iz primjera izvršite na vlastitom računalu, jer najbolje čovjek uči kad sam nešto isproba.

Knjiga s tehničke strane neće biti od veće koristi nekom malo iskusnijem administratoru, ali sa ove poslovne strane će pružiti mnoštvo korisnih informacija. Mnogi iskusni administratori se zbog stečenog samopouzdanja i iskustva često znaju opustiti i ne vodit previše računa o dokumentaciji, detaljnom planiranju i sličnim stvarima što ih može dovesti do problema. U knjizi je dobro opisana važnost dokumentacije i kontrolnih listi (checklist) koje smanjuju stres u radu, smanjuju mogućnost nastanka greški i slično.

A što se tiče početnika – ova knjiga nek vam bude prva u literaturi uz Oracle dokumentaciju. Tek nakon ove knjige se uhvatite čitat knjiga pisanih od strane gospodina Tom Kyte-a.

Ocjena 9/10


Kako instalirati Oracle Client 11g na Windows 7 ?

Monday, 17.08.2009 – msutic

U zadnje se vrijeme dosta rijetko sjetim napisati neki tekst zbog nedostatka vremena ili ideja, ali nikako ne mislim odustati od pisanja “blog zapisa”. Inače imam i vlastiti blog na engleskom jeziku (http://msutic.blogspot.com) odakle odabirem interesantne tekstove koje potom zapišem ovdje na hrvatskom jeziku. Ova je stranica jednostavno mnogo popularnija od mog privatnog bloga, te će zbog toga tekstovi koje ovdje zapišem biti dostupniji ljudima. Nadam se da je to u redu 🙂

U ovom postu bi htio pokazati kako upogoniti Oracle Client 11g aplikaciju na Windowsu 7. Oracle za sada još nije certificirao Windows 7 operativni sustav, te će vam standardna instalacija zbog tog razloga pucati. Ali taj se problem može vrlo lako zaobići.

Naime instalacija klijenta će vam puknuti kod provjere verzije operativnog sustava sa greškom:

Checking operating system requirements …
Expected result: One of 5.0,5.1,5.2,6.0
Actual Result: 6.1
Check complete. The overall result of this check is: Failed <<<<
Problem: Oracle Database 11g is not certified on the current operating system.
Recommendation: Make sure you are installing the software on the correct platform.
========================================================

Da bi se ta provjera zaobišla potrebno je malo izmijeniti refhost.xml datoteku i dodati zapis za Windows 7.

Datoteku refhost.xml se može pronaći na lokaciji:
c:\unpacked_client_installation\win32_11gR1_client\client\stage\prereq\client\refhost.xml

Isječak iz refhost.xml datoteke:

<CERTIFIED_SYSTEMS>
<OPERATING_SYSTEM>
<!–Microsoft Windows 2000–>
<VERSION VALUE="5.0"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<!–Microsoft Windows XP–>
<VERSION VALUE="5.1"/>
<SERVICE_PACK VALUE="1"/>
</OPERATING_SYSTEM>
<OPERATING_SYSTEM>
<!–Microsoft Windows 2003–>
<VERSION VALUE="5.2"/>
</OPERATING_SYSTEM>
<!–Microsoft Windows Vista–>
<OPERATING_SYSTEM>
<VERSION VALUE="6.0"/>
</OPERATING_SYSTEM>
<!–Microsoft Windows 7–>
<OPERATING_SYSTEM>
<VERSION VALUE="6.1"/>
</OPERATING_SYSTEM>

</CERTIFIED_SYSTEMS>

Tu sam podebljao zapis koji je potrebno dodati i ponovo inicirati instalaciju. Nakon toga bi sve provjere trebale uspješno proći i instalacija bi trebala završiti bez greške.

Osobno sam testirao samo značajke klijenta koje i inače koristim u svakodnevnom radu, te je sve funkcioniralo besprijekorno. Moguće je da neke stvari kod nekoga neće raditi, ali sa tim se nisam zamarao s obzirom da kod mene funkcionira sve što mi treba.

Eto, sad kad možete instalirati Oracle klijenta ništa vas više ne sprječava da instalirate i isprobate nove Windowse 🙂


Upoznavanje

Monday, 17.08.2009 – Noctua4u

Pozdrav čitaocima (prava reč? Možda… posetiocima? U svakom slučaju, svima!) ovog bloga!

I ranije sam pratio tekstove koji ovde izlaze. Neke stvari sam znao, neke znao pa zaboravio i ovde obnovio, a neke, da se ne lažemo, i naučio.
Sada, na poziv Dejana, priključujem se timu ljudi koji pišu za ovaj blog.

Igrom (ne?)srećnih slučajeva, prvi posao mi je bio vezan za Oracle. Tada naučio dosta toga, uglavnom kako NE treba raditi (ali otom… potom).
I od tada, pa naovamo, vazda se susrećem sa istim. Uglavnom Oracle pronalazi mene. Eto, živimo i koegzistiramo.

Da li znam dosta o Oraclu?
Kategorično NE!
Ovde postoji jedna zabluda: Kada neko kaže Oracle, misli na Oracle Database. Eeee, nije… Oracle je jedna velika firam koja u svojoj gami ima mnogo proizvoda… Teško je samo nabrojati ih, a kamo li znati koristiti ih sve na pravi način…

Da li znam dosta o Bazama?
Pa… odgovor je, uglavnom, NE!
Na ovom Svetu, malo ljudi može da se pohvali da ZNA baze. Veliko je to polje u kome ima protivrečnih zahteva.
Mi ostali, srećom, posle godina iskustva, znamo da UČIMO i znamo da prepoznamo šta ne znamo!

Neretko sam radio i posao DBA i Developera. Često, nespojiva zanimanja. I sada sam u velikoj firmi na istoj poziciji.
Pa, stoga, pisaću o onome što trenutno radim (Oracle DBA i Oracle Developer) i koje probleme trenutno rešavam.

Zadovoljstvo mi je bilo čitati, a sada i pisati, ovde.
Nadam se da će i Vama biti od koristi moje pisanije,

Vaš Noctua4u.
http://noctua4u.blogspot.com

PS. Obzirom da sam upravo završio jedan zanimljiv projekat, u sledećim postovima: Tipovi i Kolekcije


Kreiranje connection pool-a za Oracle na Tomcat 6 app serveru

Tuesday, 04.08.2009 – Darko

U posljednjih nekoliko dana, dobar dio mog vremena , a bogami i živaca, oduzeo je zadatak po kojem ovaj post nosi naziv.

Očigledno niko nije čuo moj predlog da se na (IT) fakultete kao obavezan predmet uvede i “aplikativni serveri” , pa se ovakve stvari uvijek nauče na teži način 🙂

Podešavanje app servera je po pravilu dosadan posao jer ima toliko stvari koje treba na toliko mjesta unijeti a , za đavola , nikad nigdje nema iscrpnija dokumentacija koja ovo pokriva a koja je napisana tako da na jednostavan način objasni šta sve i kada učiniti. Sjećam se kada sam prvi put podešavao Oracle AS… 🙁

Srećom, ono kroz što ćemo sada proći je poprilično lako i kratko podešavanje, ali itekako korisno.
Mislim da je ovo tema koja može biti interesantna kako developerima, tako i administratorima koji održavaju neki IS.

Kreiranje connection pool-a je veoma dobra praksa kada se razvija aplikacija koja se često konektuje na bazu podataka jer je mnogo “jeftinije” koristiti jednu od već kreiranih konekcija nego svaki put iznova prolaziti kroz čitav proces konektovanja na bazu podataka.
Toliko dobra da mnogi aplikativni serveri već u sebi imaju implementiran pool konekcija. Jedan od takvih servera je i Tomcat , sa kojim sam i ja radio.
Na nama je, naravno, da sve samo dobro ispodešavamo i obezbjedimo aplikativnom serveru odgovarajuće drajvere za rad sa određenom bazom podataka.
Nakon toga , po potrebi jednostavno uzimamo konekcije iz pool-a, i obavezno vodimo računa o njihovom pravilnom korišćenju.

U ovom postu, ja ću podesiti Tomcat 6.0.18 , a baza za koju ću kreirati konekcije je Oracle 10g.

Na Internetu ima dosta priče i primjera o ovome, ali je u znantnoj mjeri vezano za starije verzije Tomcat-a ( 4 , 5 , 5.5 ), međutim za sve ove verzije Tomcat-a podešavanja i određene specifikacije su drugačije , pa samim tim na verziji 6.xx najvjerovatnije neće ni raditi. makar je to bio slučaj kod mene.

Sada kad pogledam, kreiranje connection pool-a je poprilično lak posao, ali valjda je tako sa svačim, kada to jednom uradiš sve za što si mislio da je prekomplikovano odjednom postaje logično i poprilično intuitivno. Međutim, dok tražiš odgovore i pokušavaš nešto pokrenuti, a ono jednostavno neće da radi pa neće, onda stvari postanu jako napete i teške…

Prerequisites:
Prvo što je potrebno da imamo je , naravno, Tomcat.
Verziju 6 možete skinuti slijedeći ovaj link.
Pošto za pisanje koda koristim NetBeans 6.5, onda imam mogućnost da koristim i Tomcat koji dođe u instalaciji ovog IDE-a, što ću i učiniti.

Dalje, potrebni su nam i odgovarajući drajveri za konekciju na Oracle 10g. Za to nam je dovoljan fajl ojdbc14.jar koji dođe u samoj instalaciji Oracle-a.

Kopirajmo ovaj fajl u <Tomcat home dir>/lib/ folder.

I na kraju, naravno, potrebna nam je i instalirana baza podataka. Provjerite da li je baza koju želite koristiti dostupna i da li se na nju možete bez problema konektovati.

kreiranje connection pool-a

Kreiranje samog pool-a je veoma brza operacija. Recimo da je context path aplikacije /myapp. Tada je potrebno da:

1. U fajl context.xml, koji se nalazi unutar foldera META-INF vašeg projekta prepravimo da sada izgleda ovako:

<?xml version=”1.0″ encoding=”UTF-8″?>
<Context path=”/myapp” docBase=”myapp” reloadable=”false”>
<Resource name=”jdbc/oraclekonekcija” auth=”Container”
type=”javax.sql.DataSource” username=”existing_username” password=”user_password”
driverClassName=”oracle.jdbc.driver.OracleDriver” url=”jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:sid”
maxActive=”10″ maxIdle=”5″/>
</Context>

Setovanjem parametara određujemo kako će naš connection pool izgledati. Spisak svih parametara potražite na Tomcat-ovim stranicama.

2. U fajl web.xml vaše aplikacije , između tagova <web-app> i <-web-app> je potrebno unijeti:

<resource-ref>
<res-ref-name>jdbc/oraclekonekcija</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

I to je to!
Naravno, ovo nije jedini način da se izvede conection pool na Tomcat-u 6, ali je poprilično jednostavan, a i meni je jedini koji je uspio normalno proraditi.

korišćenje konekcija unutar naše web aplikacije

Kao što je kreiranje pool-a konekcija bilo jednostavno, tako je otprilike jednako jednostavno i korišćenje konekcija unutar kreiranog pool-a.

U java EE , DataSource objekti se dobijaju korišćenjem JNDI lookup mehanizma.
Sve što je potrebno da uradite je da na mjestu gdje je potrebno dobiti konekciju stavimo npr.

Connection connection = null;
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup(“java:comp/env”);
DataSource ds = (DataSource) envCtx.lookup(“jdbc/oraclekonekcija”);
connection = ds.getConnection();

i to je to.

Međutim, kako je JNDI lookup “skupa” operacija, dobar predlog je da se ovako nešto uradi jednom da bi se dobio DataSource ( od kojeg kreiramo Connection ) , taj DataSource stavimo gdje nam odgovara, kako bi uvijek mogli bez mnogo trošenja resursa kreirati connection sa

Connection connection = dataSource.getConnection();

Ovo bi se npr. moglo uraditi unutar application listener-a ili prilikom logovanja korisnika , smještajući dobijeni DataSource u ServletContext.

Koga više zanima ova tema, sve je poprilično fino objašnjeno sa dosta primjera u 11. poglavlju knjige koju sam ranije opisao na svom blogu.

Za kraj, vrlo je važno pridržavati se određenih pravila pri radu kako ne bi došli u situaciju da jedna ili više konekcija iz pool-a postanu nedostupne.
Npr. nekon završetka rada sa ResultSet-ovima, Statements-ima i Connections-ima uvijek eksplicitno zatvorimo ove objekte. Ukoliko to ne uradimo, postoji velika mogućnost da “zarobimo” konekciju sa kojom smo radili.
Tomcat i za to ima podešavanja koja omogućavaju da se konekcije koje se dugo ne koriste oslobode nakon nekog vremena od strane samog servera.
Međutim, bolja je praksa da prvo uradimo sve što je u našoj moći da do ovakvih stvari nikada i ne dođe.

Eto, nadam se da sam ovim postom nekome uštedio mnogo živaca i vremena i makar ga malo uveo u ovu temu.

Do sljedećeg javljanja…