Database Connection Pool Yönetimi: Bağlantı Sızıntılarını Bulup Giderme

Veritabanına bağlantı açmak pahalı bir işlemdir. Pool yönetimi bunu çözmek için önceden belirli sayıda bağlantı hazırlar ve uygulamanın ihtiyacına göre dağıtır. Ama bu bağlantılar kapatılmazsa sızıntı oluşur ve sonunda tüm pool tükenip uygulama donup kalır.

Bağlantı sızıntısının temel nedeni: bir işlem bittiğinde bağlantıyı pool'a geri vermemektir. Özellikle istisna (exception) atıldığında bu sıkça olur. Kod, hata yaşadığında bağlantı kapatma satırına ulaşmaz ve bağlantı açık kalır.

Sorunu Tanımak

İlk adım pool durumunu izlemektir. Çoğu pool kütüphanesi bağlantı sayılarını raporlar. Java'da HikariCP kullanan bir uygulamada:

1HikariConfig config = new HikariConfig();
2config.setMaximumPoolSize(10);
3config.setMinimumIdle(2);
4config.setConnectionTimeout(30000);
5HikariDataSource dataSource = new HikariDataSource(config);
6
7// Pool durumunu kontrol et
8int active = dataSource.getHikariPoolMXBean().getActiveConnections();
9int idle = dataSource.getHikariPoolMXBean().getIdleConnections();
10System.out.println("Aktif: " + active + ", Boş: " + idle);

Eğer aktif bağlantı sayısı zamanla artarsa ve hiç düşmezse sızıntı vardır.

Sızıntıyı Gidermek

Bağlantıyı her zaman geri vermek gerekir. Try-with-resources kullanın:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1try (Connection conn = dataSource.getConnection()) {
2PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id =?");
3stmt.setInt(1, 1);
4ResultSet rs = stmt.executeQuery();
5if (rs.next()) {
6System.out.println(rs.getString("name"));
7}
8} catch (SQLException e) {
9e.printStackTrace();
10}
11// Çıkışta otomatik olarak bağlantı kapatılır

Bu yapı hata atılsa bile bağlantıyı kapatır. Eski kodda:

1Connection conn = null;
2try {
3conn = dataSource.getConnection();
4// işlem
5} finally {
6if (conn!= null) {
7conn.close();
8}
9}

Timeout Ayarları

Pool'un bağlantıları belirli süre sonra kapatması sağlayın:

1config.setIdleTimeout(600000); // 10 dakika boş kaldıktan sonra kapat
2config.setMaxLifetime(1800000); // Maksimum 30 dakika yaşasın

Bu ayarlar çok uzun süre açık kalan bağlantıları otomatik temizler.

İzleme

Uygulamanız çalışırken pool durumunu periyodik olarak logla. Aktif bağlantı sayısı maksimuma yaklaşırsa alarm ver. Böylece sızıntı erkenden fark edilir ve sorgu yavaşlığından önce çözülür.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz