Kreiranje connection pool-a za Oracle na Tomcat 6 app serveru
Tuesday, 04.08.2009 – DarkoU 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…