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);67// Pool durumunu kontrol et8int 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:
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ırBu yapı hata atılsa bile bağlantıyı kapatır. Eski kodda:
1Connection conn = null;2try {3conn = dataSource.getConnection();4// işlem5} 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 kapat2config.setMaxLifetime(1800000); // Maksimum 30 dakika yaşasınBu 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.
0 yorum