mssql-django'da bağlantı havuzu oluşturma

Bu makalede, mssql-django içinde bağlantı havuzunun nasıl çalıştığı ve bunu Django uygulamanız için nasıl yapılandıracağınız açıklanmaktadır.

Bağlantı havuzu nasıl çalışır?

Varsayılan olarak, mssql-django sürücü düzeyinde bağlantı havuzu kullanılır. Varsayılan pyodbc yolu pyodbc havuzlamasını kullanırken, mssql-python yolu mssql-python havuzlamasını kullanır. Django bir bağlantıyı kapattığında, etkin sürücü altta yatan veritabanı bağlantısını kapatmak yerine bağlantıyı bir havuza geri verir. Sonraki bağlantı istekleri havuza alınan bağlantıları yeniden kullanır ve bu da yeni veritabanı bağlantıları kurma yükünü azaltır. Sürücü seçimi detayları için bkz. Mssql-django için veritabanı sürücüsünü seç.

Bağlantı havuzunu yapılandırma

Bağlantı havuzlama, DATABASE_CONNECTION_POOLING içinde modül düzeyine yerleştirilen settings.py ayarı tarafından kontrol edilir (DATABASES sözlüğünün dışında):

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

# Set to False to disable driver-level connection pooling
DATABASE_CONNECTION_POOLING = False
Değer Behavior
True (varsayılan) Bağlantı havuzu etkinleştirildi. Kapatılan bağlantılar havuzuna geri döndürülür.
False Sürücü düzeyinde bağlantı havuzu devre dışı bırakılmıştır. pyodbc yolu Database.pooling=False ayarlar ve mssql-python yolu PoolingManager.disable() çağırır.

Bağlantı havuzu ne zaman devre dışı bırakılır?

Bu senaryolarda bağlantı havuzunu devre dışı bırakmayı göz önünde bulundurun:

  • Belirteç tabanlı kimlik doğrulaması: Süresi dolan erişim belirteçlerini kullanırken havuza alınan bağlantılar eski belirteçleri barındırabilir.
  • Bağlantı sorunlarında hata ayıklama: Bağlantı havuzunu devre dışı bırakmak, her isteğin yeni bir bağlantı oluşturmasını sağlayarak sorun gidermeyi basitleştirir.
  • Kısa süreli işlemler: Birkaç sorgu oluşturup çıkan betikler veya yönetim komutları için havuza alma hiçbir avantaj sağlamaz.

Bağlantı yeniden deneme ayarları

Bağlantı havuzu ayarından bağımsız olarak, başarısız bağlantı girişimleri için yeniden deneme davranışını yapılandırabilirsiniz. Yeniden deneme ve zaman aşımı seçeneklerinin tam listesi için Yapılandırma referansı bölümüne bakın.

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
            "connection_retries": 3,
            "connection_retry_backoff_time": 10,
            "connection_timeout": 30,
        },
    },
}

Django'nun CONN_MAX_AGE

Django ayrıca Django'nun bir veritabanı bağlantısını kapatmadan önce ne kadar süre açık tuttuğunu denetleyan bir ayar sağlar CONN_MAX_AGE . Bu ayar, sürücü düzeyinde bağlantı havuzu ile birlikte çalışır:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "CONN_MAX_AGE": 600,  # Keep connections open for 10 minutes
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
    },
}

hakkında CONN_MAX_AGEdaha fazla bilgi için Django veritabanı ayarları belgelerine bakın.

Pratik başlangıç noktaları:

  • CONN_MAX_AGE=0: hata ayıklama ve kısa süreli işler için en güvenli.
  • CONN_MAX_AGE=600: birçok web uygulaması için iyi varsayılan.
  • CONN_MAX_AGE=3600: yük testlerinden sonra sürekli yüksek aktarım hızına sahip hizmetler için makul.

Note

ASGI sunucularını (örneğin Daphne veya Uvicorn) ya da iş parçacığı kullanan dağıtımları kullandığınızda, kalıcı bağlantılar asenkron bağlamlar arasında sızabilir. CONN_MAX_AGE’ı bir ASGI sunucusuyla kullanıyorsanız, desteklenen Django sürümlerinde CONN_HEALTH_CHECKS = True ayarlayın ve gerçekçi eşzamanlılık altında test edin. Daha fazla bilgi için bağlantı yönetimiyle ilgili Django belgelerine bakın.

CONN_HEALTH_CHECKS yeniden kullanımdan önce bağlantı havuzundaki bağlantıları doğrular. Django eski bir bağlantı algılarsa, şeffaf bir şekilde yeni bir bağlantı açar. Bu, istek başına küçük bir denetim maliyeti ekler ve genellikle uzun süreli işlemler için etkinleştirmeye değer.