Pengumpulan koneksi di mssql-django

Artikel ini menjelaskan cara kerja mssql-django pengumpulan koneksi dan cara mengonfigurasinya untuk aplikasi Django Anda.

Cara kerja pengumpulan koneksi

Secara bawaan, mssql-django menggunakan pengumpulan koneksi tingkat driver. Jalur pyodbc default menggunakan pooling pyoDBC, dan jalur mssql-python menggunakan pooling mssql-python. Ketika Django menutup koneksi, driver aktif mengembalikannya ke pool, bukan menutup koneksi database yang mendasarinya. Permintaan koneksi berikutnya menggunakan kembali koneksi yang dikumpulkan, yang mengurangi overhead pembuatan koneksi database baru. Untuk detail pemilihan driver, lihat Pilih driver database untuk mssql-django.

Mengonfigurasi pengumpulan koneksi

Pooling koneksi dikontrol oleh pengaturan DATABASE_CONNECTION_POOLING, yang ditempatkan pada level modul di settings.py (di luar kamus DATABASES):

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
Nilai Behavior
True (standar) Kumpulan koneksi diaktifkan. Koneksi yang ditutup dikembalikan ke pool.
False Pooling koneksi tingkat pengemudi dinonaktifkan. Jalur pyodbc mengatur Database.pooling=False, dan jalur mssql-python memanggil PoolingManager.disable().

Kapan harus menonaktifkan pengumpulan koneksi

Pertimbangkan untuk menonaktifkan pengumpulan koneksi dalam skenario ini:

  • Autentikasi berbasis token: Saat menggunakan token akses yang kedaluwarsa, koneksi yang dikumpulkan mungkin menyimpan token kedaluwarsa.
  • Menangani masalah koneksi: Menonaktifkan pooling koneksi menyederhanakan pemecahan masalah dengan memastikan setiap permintaan membuat koneksi baru.
  • Proses yang berjalan singkat: Untuk skrip atau perintah manajemen yang menjalankan beberapa kueri lalu selesai, pooling tidak memberikan manfaat.

Pengaturan percobaan ulang koneksi

Terlepas dari pengaturan pooling, Anda dapat mengonfigurasi perilaku percobaan ulang untuk upaya koneksi yang gagal. Untuk daftar lengkap opsi coba lagi dan waktu habis, lihat Referensi konfigurasi.

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,
        },
    },
}

CONN_MAX_AGE milik Django

Django juga menyediakan CONN_MAX_AGE pengaturan yang mengontrol berapa lama Django menjaga koneksi database terbuka sebelum menutupnya. Pengaturan ini bekerja bersamaan dengan pooling koneksi tingkat driver:

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",
        },
    },
}

Untuk informasi selengkapnya tentang CONN_MAX_AGE, lihat dokumentasi pengaturan database Django.

Titik awal praktis:

  • CONN_MAX_AGE=0: paling aman untuk penelusuran kesalahan dan tugas berumur singkat.
  • CONN_MAX_AGE=600: default yang baik untuk banyak aplikasi web.
  • CONN_MAX_AGE=3600: wajar untuk layanan dengan throughput tinggi yang konsisten setelah pengujian beban.

Note

Ketika Anda menggunakan server ASGI (seperti Daphne atau Uvicorn) atau deployment berulir, koneksi persisten dapat bocor melintasi konteks asinkron. Jika Anda menggunakan CONN_MAX_AGE dengan server ASGI, atur CONN_HEALTH_CHECKS = True pada versi Django yang didukung dan uji dalam kondisi konkurensi yang realistis. Untuk informasi selengkapnya, lihat dokumentasi Django tentang manajemen koneksi.

CONN_HEALTH_CHECKS memvalidasi koneksi terkumpul sebelum digunakan kembali. Jika Django mendeteksi koneksi kedaluwarsa, Django secara transparan membuka koneksi baru. Ini menambahkan biaya pemeriksaan per permintaan kecil dan biasanya layak diaktifkan untuk proses berumur panjang.