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

August 4, 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…

Post a Comment