Sdružování připojení v mssql-django

Tento článek vysvětluje, jak funguje mssql-django sdružování připojení a jak ho nakonfigurovat pro vaši aplikaci Django.

Jak funguje sdružování připojení

Ve výchozím nastavení používá mssql-django poolování připojení na úrovni ovladačů. Výchozí cesta pyodbc používá pooling pyodbc a cesta mssql-python využívá pooling mssql-python. Když Django ukončí spojení, aktivní ovladač ho vrátí do poolu místo uzavření základního databázového spojení. Následné požadavky na připojení znovu využívají sdružená připojení, což snižuje režii spojenou s navazováním nových databázových připojení. Pro podrobnosti o výběru ovladačů viz Vybrat ovladač databáze pro mssql-django.

Na trase mssql-python s výchozím msodbcsql18 nativním poskytovatelem ovladač ověří spojení z fondu před opětovným použitím. Během validace aplikuje dočasný nativní časový limit operace připojení, přičemž používá kladný časový limit přihlášení nebo 15 sekund, když není uvedena žádná kladná hodnota. Pokud ověření selže, ovladač toto spojení zahodí a pokusí se o nové fyzické spojení místo ověření každého nečinného spojení v pořadí. Více validačních operací, čištění a náhradní přihlášení mohou prodloužit dobu. Není to úplný termín pro ověření nebo uvolnění připojení. Vrácení připojení do poolu není omezeno časovým limitem validace při odebrání z poolu. Pro více informací viz mssql-python connection pooling.

Než se přihlásíte k poskytovateli verze Preview mssql-odbc, projděte si jeho známé problémy.

Konfigurace sdružování připojení

Sdružování připojení se řídí pomocí nastavení DATABASE_CONNECTION_POOLING, které je umístěno na úrovni modulu v settings.py (mimo slovník 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
Value Behavior
True (výchozí) Sdružování připojení je povolené. Uzavřená připojení se vrátí do fondu.
False Pooling připojení na úrovni ovladačů je zakázán. Cesta pyodbc nastavuje Database.pooling=False, a cesta mssql-python volá PoolingManager.disable().

Kdy zakázat sdružování připojení

Zvažte zakázání sdružování připojení v těchto scénářích:

  • Ověřování na základě tokenů: Při použití přístupových tokenů, jejichž platnost vyprší, můžou připojení ve fondu obsahovat zastaralé tokeny.
  • Ladění problémů s připojením: Zakázání sdružování připojení zjednodušuje odstraňování potíží tím, že každý požadavek vytvoří nové připojení.
  • Krátkodobé procesy: Pro skripty nebo příkazy pro správu, které provedou jen několik dotazů a skončí, nepřináší poolování žádnou výhodu.

Nastavení opakování připojení

Bez ohledu na nastavení poolingu můžete nakonfigurovat chování při opakovaných pokusech o navázání připojení po selhání. Úplný seznam možností opakování a vypršení časového limitu najdete v referenčních informacích ke konfiguraci.

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

Parametr CONN_MAX_AGE v Djangu

Django také poskytuje CONN_MAX_AGE nastavení, které určuje, jak dlouho Django udržuje připojení k databázi otevřené před zavřením. Toto nastavení funguje paralelně s poolováním připojení na úrovni ovladače:

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

Další informace o CONN_MAX_AGEnastavení databáze Django naleznete v dokumentaci k nastavení databáze Django.

Praktické výchozí body:

  • CONN_MAX_AGE=0: Nejbezpečnější pro ladění a krátkodobé úlohy.
  • CONN_MAX_AGE=600: Dobré výchozí nastavení pro mnoho webových aplikací.
  • CONN_MAX_AGE=3600: přiměřené pro stabilní služby s vysokou propustností po zátěžových testech.

Note

Když používáte ASGI servery (například Daphne nebo Uvicorn) nebo vláknové nasazení, trvalá spojení mohou unikat napříč asynchronními kontexty. Pokud používáte CONN_MAX_AGE s ASGI serverem, nastavte CONN_HEALTH_CHECKS = True v podporovaných verzích Django a testujte v podmínkách realistické souběžnosti. Další informace najdete v dokumentaci Django ke správě připojení.

CONN_HEALTH_CHECKS ověřuje sdružená připojení před jejich opětovným použitím. Pokud Django zjistí zastaralé připojení, transparentně otevře nové připojení. To přidává malou režii na kontrolu každého požadavku a obvykle se vyplatí to povolit pro dlouho běžící procesy.