PostgreSQL ile Go: Bağlantı Pooling ve Query Timeout
PostgreSQL veritabanına bağlanan Go uygulamalarında en sık karşılaşılan sorun, bağlantıları verimli yönetememek ve uzun sürülen sorguların uygulamayı dondurmakıdır. Bağlantı havuzu (connection pool) bu sorunları çözer: birden fazla bağlantıyı hazır tutar, gerektiğinde yeniden kullanır ve sistem kaynaklarını korur. Timeout ise kilitlenmemiş, hızlı bir uygulama sağlar.
Go'da pgx kütüphanesi bu işleri kolaylaştırır. Veritabanı bağlantısı açarken havuz boyutunu, boşta kalma süresi limitini ve sorgu zaman aşımını tek seferde ayarlayabilirsin.
1package main23import (4"context"5"fmt"6"time"78"github.com/jackc/pgx/v5/pgxpool"9)1011func main() {12ctx, cancel:= context.WithTimeout(context.Background(), 5*time.Second)13defer cancel()1415config, err:= pgxpool.ParseConfig("postgresql://user:password@localhost:5432/mydb")16if err!= nil {17fmt.Println("Config hatası:", err)18return19}2021// Havuz ayarları22config.MaxConns = 2523config.MinConns = 524config.MaxConnLifetime = 15 * time.Minute25config.MaxConnIdleTime = 5 * time.Minute2627pool, err:= pgxpool.NewWithConfig(ctx, config)28if err!= nil {29fmt.Println("Pool oluşturma hatası:", err)30return31}32defer pool.Close()3334// Timeout'lu sorgu35queryCtx, queryCancel:= context.WithTimeout(context.Background(), 2*time.Second)36defer queryCancel()3738var name string39err = pool.QueryRow(queryCtx, "SELECT name FROM users WHERE id = $1", 1).Scan(&name)40if err!= nil {41fmt.Println("Sorgu hatası:", err)42return43}4445fmt.Println("Kullanıcı:", name)46}Burada MaxConns en fazla 25 bağlantı açar, MinConns ise başlangıçta 5 tanesini hazır tutar. MaxConnIdleTime 5 dakikadan uzun boş kalan bağlantıları kapatır, böylece veritabanı sunucusundaki kaynak boşa gitmez. QueryRow çağrısında context timeout koyarsak, 2 saniyeyi aşan sorgular otomatik iptal olur.
Sık yapılan hata: context.Background() ile timeout'suz sorgu açmak. Bir sorgu asılı kalırsa, bağlantı havuzu tükenebilir ve yeni istekler beklemeye başlar. Her zaman context.WithTimeout() kullan. Ayrıca pool.Close() çağrısını unutma; kapatmadığında bağlantılar açık kalıp kaynak sızıntısı yaşarsın.
0 yorum