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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1package main
2
3import (
4"context"
5"fmt"
6"time"
7
8"github.com/jackc/pgx/v5/pgxpool"
9)
10
11func main() {
12ctx, cancel:= context.WithTimeout(context.Background(), 5*time.Second)
13defer cancel()
14
15config, err:= pgxpool.ParseConfig("postgresql://user:password@localhost:5432/mydb")
16if err!= nil {
17fmt.Println("Config hatası:", err)
18return
19}
20
21// Havuz ayarları
22config.MaxConns = 25
23config.MinConns = 5
24config.MaxConnLifetime = 15 * time.Minute
25config.MaxConnIdleTime = 5 * time.Minute
26
27pool, err:= pgxpool.NewWithConfig(ctx, config)
28if err!= nil {
29fmt.Println("Pool oluşturma hatası:", err)
30return
31}
32defer pool.Close()
33
34// Timeout'lu sorgu
35queryCtx, queryCancel:= context.WithTimeout(context.Background(), 2*time.Second)
36defer queryCancel()
37
38var name string
39err = pool.QueryRow(queryCtx, "SELECT name FROM users WHERE id = $1", 1).Scan(&name)
40if err!= nil {
41fmt.Println("Sorgu hatası:", err)
42return
43}
44
45fmt.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.

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