tomcat ile mysql connection pooling nasıl yapılır?

jndi, mysql, tomcat, java June 12th, 2007

Doomy

tomcat ile mysql connection pooling nasıl yapılır?

import java.manyaklari.org;

Zamanimizda nerdeyse hic bir web aplikasyonu connection poolingsiz dusunulemez bir duruma geldi.
Bu gun size wep aplikasyonunuzu nasil connection poolingli haline getirebilceginizi gostericez.

Hepiniz hosgeldiniz arkadaslar. Bugun Tomcat ve Mysql arasinda bir JNDI DataSource pastasi yapicaz.

Pastamiz icin gerekli malzemeler:

1 adet *MYSQL 5.0.17
1 adet MySQL driver //Download Connector J 3
1 adet * Apache-Tomcat-5.5.12 tomcat.apache.org
3 adet commons lib jakartadan indirebilirsiniz.
200 gram *SQL Yog (Gerekli deil sadece g�zel bir ara� oldugu icin buraya yazdim.Ilerde mysql ile daha kolay oynamak icin download ettim.)
URL:www.webyog.com (web diye bisi yokmush hehe)
Simdi sistemi kurmadan evvel tomcat.apache.orgdan okudugum bir kac onemli noktayi hemen sizinle paylasayim. Bunlari kafaniza kaziyalim.

1) Database connection pool u database bir havuz acar ve bunu yonetir.
Cope atma ve tekrar kullanmak her defasinda DB ye gidip gelmekden daha verimlidir.
2) Connection poolingde bir problem vardir. Bir web aplikasyonu ResultSet, Statement ve Connectionlari isi bitince kapatmalidir.
Aksi takdirde pooldaki t�m resourcelar kullanildiginda web aplikasyonunuz db a connection pool “leak” denen duruma duser.
Bu da web aplikasyonun durmasina sebep olabilir.
3) Bu problem Jakarta-Commons DBCP yi basi bos birakilmis connectionlari toplama ve geri koyma ile ortadan kaldirilabilinir..

Tamam simdi MySQL , Tomcat ve SqlYog u kuralim.
Burda kurulmusu var…hehe
Evet simdi devam ediyoruz…

Simdi kullanacagimiz olan jar dosyalarini common/lib/ altina koyalim.
commons-pool-1.2.jar
commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
mysql-connector-java-3.1.7-bin.jar
Evet simdi geldi yavas yavas Tomcatimizi config etmeye baslayalim.

Simdi oncelikle Tomcatin web sayfasinda anlatilan JNDI configurationi bence yalan o sekilde denedigimde olmadi. Bide benim yolumu deneyin.
Cok basit. bir kac kural var hemen gorelim
Kural 1 : Conf/catalina/ altina context iniz neyse o isimle bir xml dosyasi olusturun
Kural 2 : bu dosyadaki docBase uzun seklinde verilmeli tam adres.
Kural 3: web.xml inizi olusturun
Kural 4: Context lookup da java:comp/env seklinde olsun.
DataSource ds = (DataSource) ctx.lookup(”java:comp/env/jdbc/TestDB”);
Seklinde olmali. Bu kadar.

Simdi SQL Yog ve ya command line ile test diye bir database acalim. Ve bu database in icine testdata adinda bir tablo acalim bu tablonun ilk kolunu id ikinci kolon varchar() ucuncu kolon ise int olsun.

KURAL 1-2
Conf/catalina/ altina context iniz neyse o isimle bir xml dosyasi olusturun benimki DBTest.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<Context path=”/DBTest” docBase=”E:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\DBTest” debug=”1″ reloadable=”true”>
<Resource name=”jdbc/TestDB” auth=”Container” type=”javax.sql.DataSource”
initialSizse=”30″ maxActive=”100″ maxIdle=”30″ maxWait=”10000″
username=”root” password=”root” driverClassName=”com.mysql.jdbc.Driver”
removeAbandoned=”true” removeAbandonedTimeout=”60″ logAbandoned=”true”
url=”jdbc:mysql://localhost:3306/test”/>
</Context>

KURAL 3
Projenizin web.xml dosyasina

<?xml version=”1.0″ encoding=”UTF-8″?>
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

kismini ekliyoruz.

KURAL 4
Context ctx = new InitialContext();
if(ctx == null )
throw new Exception(”Boom - No Context”);
DataSource ds = (DataSource) ctx.lookup(”java:comp/env/jdbc/TestDB”);
Seklinde olmali..
DBTest Netbeans dosyalari  DB test Zip
Catalina altina konulcak olan xml dosyasi DBTEST.XML.zip


Social Bookmarking
Add to: Mr. Wong Add to: Digg Add to: Del.icio.us Add to: Reddit Add to: StumbleUpon Add to: Slashdot Add to: Netscape Add to: Furl Add to: Yahoo Add to: Google Add to: Technorati Add to: Newsvine Add to: Ma.Gnolia



Başka Manyak Konular


Lütfen Yorumlarınızı bizimle paylaşın.

13 Responses to “tomcat ile mysql connection pooling nasıl yapılır?”

  1. hakdogan Says:

    Hocam Merhaba

    İlk CP denememi buradaki anlatımınızı baz alarak yapmaya çalıştım ancak muaffak olamadım.

    mysql veritabanı adım hakdogan

    proje klasörüm C:\Tomcat\webapps\ROOT altında deneme adında.

    common\lib altına

    commons-collections-3.2.jar
    commons-pool-1.3.jar
    commons-dbcp-1.2.2.jar
    mysql-connector-java-5.1.0-bin.jar

    dosyalarını ekledim, ardından conf\Catalina altına deneme.xml dosyasını oluşturdum, dosya içeriği

    şeklinde.

    Ardından webapps\ROOT\deneme\WEB-INF altında web.xml dosyasını oluşturdum, onun içeriğide aşağıda.

    MySQL Test App

    DB Connection
    jdbc/deneme
    javax.sql.DataSource
    Container

    bütün bunlardan sonra index.jsp de

    Context initCtx = new InitialContext();
    DataSource ds = (DataSource) initCtx.lookup(”java:comp/env/jdbc/deneme”);

    şeklinde bağlantı sağlamak istediğimde

    ERROR! Name jdbc is not bound in this Context

    şeklinde hata alıyorum.

    Acaba nerede hata ediyorum.

  2. admin Says:

    context.xml dosyanı kontrol etmeni ve doğru yere koyman gerekmekte. Aldığın hata configurasyon hatası gibi gözükmekte. Kullandığın ismi bulamıyor. Tomcat.
    Bu arada Tomcat versiyonu için yazılan xml dosyaları versiyon farkı oluyor eğer ki 5.5.x versiyonu değilse.

  3. hakdogan Says:

    Tomcat versiyonum 5.5

    context.xml dosyası C:\Tomcat\conf\Catalina dizini altında deneme.xml adı ile bulunuyor.

  4. hakdogan Says:

    bu arada yeni fark ettim dosya içerikleri çıkmamış code takları arasında bir daha deniyeyim

    conf\Catalina altında deneme.xml içeriği

    [code]

    [/code]

  5. admin Says:

    Örnek context.xml dosyası aşağıdadır.
    < ?xml version="1.0" encoding="UTF-8"?>

    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30"
    maxWait="10000"
    username="xxx"
    password="xxx"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/db_manyaklari?useUnicode=true&characterEncoding=UTF-8"/>

    dosyanın olması gereken aslında C:\Tomcat\conf\Catalina değil
    C:\Tomcat\conf\Catalina\localhost\deneme.xml dir.

    Her deployda bu dosya SIFIRLANIYOR. Bunu da kontrol etmeni öneririm. Netbeans kullanıyorsan META-INF altına context.xml diye oluşturursan otomatik deploymentı yapıyor.

  6. hakdogan Says:

    Hocam olmuyor, Netbeans da yaptığım denemede de olmuyor.

    deneme.xml dosyasını conf\Catalina\localhost\ altında oluşturdum username ve password değerlerini girdim db_manyaklari ifadesi yerine kendi veritabanı adımı yazdım ama olmadı.

    Sorun ne olabilir ?

  7. admin Says:

    Dökümanın en altına daha evvel bu yazıyı yazarken kullandığım dosyaları ekledim yardımcı olcağını düşünüyorum.
    Aynı sırayı izlersen yaparsın diye düşüyorum olmazsa bir tane resimli yazı yazmak gerekicek sanırım :)

  8. hakdogan Says:

    Öncelikle ilginize teşekkür ederim.

    Eklediğiniz proje dosyasını

    C:\Tomcat\webapps\ROOT\DBTest\ olarak açtım, ardından C:\Tomcat\conf\Catalina\localhost altında yine eklediğiniz DBTest.xml dosyasını taşıdım ve Tomcatı çalıştırdım.

    Tarayıcıma http://localhost:8080/DBTest/web/ deyip neticeyi beklerken malesef bir exception ile karşılaştım

    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    Durumu netbeans ile test edeyim dedim, projeyi import ederken netbeans aşağıdaki referans problemini verdi

    http://img524.imageshack.us/img524/4695/ads305zgo1.png

    ardından projeyi çalıştırdım aldığım çıktı

    Results
    Foo Not Connected
    Bar -1

    şeklinde.

    Yanlış anlamadı isem yine bağlantı gerçekleşmemiş.

    Bahtsız bedevimiyim neyim ben :)

  9. admin Says:

    reference problemleri eklemeniz gereken olan librarylerle alakali onlari isminden tahmin edip eklersiniz. fakat hata mesajlariniz gözükmemiş gene exceptionlar.

    foo not connected demesinin sebebi sizin database isimlerinizi,kullanıcı adı,şifrenizi değiştirmemeniz olabilir.

    Boş olduğum bir zaman da bir video yapmaya çalışayım bari.

  10. hakdogan Says:

    database ve tablolarda gerekli değişiklikleri yaptım, libraryleri de ekledim.

    Hocam acemilik işte var bir yerde eksiğimiz ama bilemiyoruz işte, düşe kalka ilerliyoruz.

    Video çok makbule geçer, ilginize çok teşekkür ederim zamanınızı aldım.

    Sağolun…

  11. hakdogan Says:

    Hocam tekrar Selam

    Yaşadığım problem bir java gurubunda değerli bir arkadaşımızın katlıları ile çözülmüştür.

    Problem cataline/localhost altında tamımlanan CP_Deneme.xml dosyasında db url bilgisine eklenen ?useUnicode=true&characterEncoding=UTF-8 ifadesinden kaynaklanıyormuş.

    İlgili satır url=”jdbc:mysql://localhost:3306/hakdogan”/> şeklinde düzenleyip proje kalsörünü webapps altına taşıyınca kod çalıştı.

    İlk bakışta mysql karekter seti problemi gibi görünüyor ama tabi siz daha doğrusunu bilirsiniz.

  12. admin Says:

    Sevindim problemini hallettiğine. :)

  13. vinnie Says:

    Selam,
    Sorunun çözüldüğüne sevindim, yanlız farkettim ki uygulamalarını ROOT altına koyuyorsun. Yeni bir context yarattığında bunu direk olarak webapps altına atmalısın. İlk denemelerinde deneme.xml’i tanımaması bundan. Sadece ROOT contextinde bir klasör açmış oluyorsun.
    Kolay gelsin.

Leave a Reply

Site Navigation

Categories

Archives

Meta

Recent Enteries

Recent Comments

FireStats iconPowered by FireStats