Pazar, Kasım 05, 2006

java, mysql, transaction, connection pool ve acı

yaklaşık 1 yıldır daha önce pek alakamın olmadığı web-veritabanı programcılığı ile uğraşmaktayım ve yoğun acılı bir yıl oldu epey bir deneyim kazandığım.

geçenlerde bu acılı günlerden birini daha yaşadım bilgi eksikliğinden kaynaklanan, insanlıkla paylaşayım aynı sıkıntıyı yaşayıp da yolu bu blogdan gecenlere ilaç olsun dedim.

herşeyden önce mysql'un öntanımlı tablo yapısı olan myisam transaction desteklemiyormuş, bu gerçeği farketmem 1 günümü aldı, ve o gün boyunca transaction üzerine koda attırdığım sonuçsuz kalan 8 farklı taklaya mal oldu, neden sonuçsuz kaldığını bir türlü anlayamadığım acı gerçeğin farkından önce.

(bu arada ek bilgi: sıra bazında okuma yazma kilidi koymak gibi bir amacınız varsa select işleminden sonra ilacınız: "google" ve "SELECT FOR UPDATE")

geçenlerde de bir uygulamada yük altında veritabani bağlantıları ile ilgili sıkıntı yaşadık, java uygulama sunucusu (jboss) üzerinde koşan bir java uygulaması idi, "connection pool" yaratmak çözüm olabilir dedim belki sunucu tarafında. bir de kodta singleton olarak değiştirdim veritabanı bağlantı açılmasını. büyük hata yapmışım, durum daha da kötüleşti.

singleton ile "connection pool" aynı koltuğa sığmaz imiş, çünkü "connection pool" demek uygulama sunucusu tarafında birsürü açık bağlantının olması demek ve bu açık bağlantılardan birisinin isteyen uygulamaya verilmesi demek, uygulama işini bitirince bağlantıyı havuza geri bırakıyor, böyle bir sistemde singleton yapmak abes oluyor haliyle, olması gereken sık sık bağlantı açıp kapamak, bir bağlantı alıp uygulama yaşam süresi boyunca aynı bağlantıyı kullanmak değil.

uygulamada singletonu kaldırıp her veritabanı metodunun başına sonuna bağlantı açma kapama kodunu ekledikten sonra bütün problemler halloldu.

aslında veritabanı bağlantısı konusunda singletona hiç girmemek lazım, onu anladım. daha önce veritabanı bağlantısının bir otobüs gibi olduğunu sanıyordum, birden fazla uygulamanın aynı anda aynı bağlantıyı kullanabildiği yanılgısı içindeydim, anladım ki özel araba gibiymiş, sadece tek bir uygulama tarafından kullanılabiliyormuş, uygulamalar sıraya giriyormuş bağlantının başında, dolayısıyla "too many connections" hataları engellenmiş oluyor ama ciddi bir başarım sıkıntısı peydahlanıyor bu sefer.

Hiç yorum yok:

Yorum Gönder