Розуміння необхідності
📚 З'єднання з базою даних споживають ресурси. Створення та закриття з'єднання для кожного запиту є неефективним, особливо під великим навантаженням. Тут на допомогу приходять сталими з'єднання та пулінг з'єднань для оптимізації взаємодії з базою даних.
Сталі з'єднання
🔄 Стале з'єднання залишається відкритим на визначений період, повторно використовуючи одне і те ж з'єднання для кількох запитів. Це зменшує накладні витрати на повторне встановлення з'єднань.
Як увімкнути сталi з'єднання в Django
Сталі з'єднання в Django контролюються параметром CONN_MAX_AGE
у налаштуваннях DATABASES
. Цей параметр вказує максимальний час життя з'єднання з базою даних. 🛠️
- За замовчуванням: За замовчуванням
CONN_MAX_AGE
встановлено на0
, що означає, що з'єднання закривається наприкінці кожного запиту. ⚙ - Налаштування
CONN_MAX_AGE
: Щоб увімкнути сталі з'єднання на певний період, встановіть значення на позитивне число (в секундах). Для безмежних сталих з'єднань встановіть значення наNone
. ♾️
Приклад конфігурації
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_database',
'USER': 'your_username',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '5432',
'CONN_MAX_AGE': 300, # З'єднання залишається відкритим протягом 300 секунд
},
}
Кращі практики для сталих з'єднань
✔️ Якщо сервер бази даних припиняє неактивні з'єднання, встановіть CONN_MAX_AGE
на значення, яке буде менше тайм-ауту сервера. Використовуйте CONN_HEALTH_CHECKS = True
, щоб перевіряти стан з'єднання під час кожного запиту і уникати помилок, коли неактивні з'єднання припиняються.
Попередження
⚠️ Сталі з'єднання можуть призвести до конкуренції за ресурси на сервері бази даних, якщо ними не керувати обережно. Вони краще підходять для додатків зі середнім або високим трафіком.
Пулінг з'єднань
🔄 Пулінг з'єднань підтримує пул повторно використовуваних з'єднань з базою даних. Коли запит потребує з'єднання, воно повторно використовує існуюче з пулу замість того, щоб відкривати нове з'єднання.
Переваги пулінгу з'єднань
- Зменшує накладні витрати на встановлення з'єднання. 💡
- Забезпечує кращу продуктивність для додатків з високою конкуренцією запитів. 🚀
- Дозволяє більш ефективно керувати ресурсами бази даних. ⚡
Пулінг з'єднань у Django 5.1 та вище
Починаючи з Django 5.1, з'явилася вбудована підтримка пулінгу з'єднань для PostgreSQL за допомогою драйвера psycopg
. 🐘
Як увімкнути пулінг з'єднань
Щоб увімкнути пулінг з'єднань, додайте словник pool
у налаштування OPTIONS
вашої конфігурації бази даних.
Приклад конфігурації
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_database',
'USER': 'your_username',
'PASSWORD': 'your_password',
'HOST': 'localhost',
'PORT': '5432',
'OPTIONS': {
'pool': {
'min_size': 2, # Мінімальна кількість з'єднань у пулі
'max_size': 4, # Максимальна кількість з'єднань у пулі
'timeout': 10, # Час (в секундах), який треба чекати для з'єднання
},
},
},
}
Як це працює
- Пул підтримує певну кількість з'єднань (
min_size
доmax_size
). 🔢 - З'єднання повторно використовуються, зменшуючи потребу створювати нові. 🔁
- Якщо всі з'єднання використовуються, додаток чекає, поки одне з'єднання не стане доступним (до досягнення часу очікування
timeout
). ⌛
Що вибрати?
🤔 Використовуйте сталі з'єднання, якщо ваш додаток має помірний трафік і ви хочете просте налаштування.
🚀 Використовуйте пулінг з'єднань для додатків з високою конкуренцією запитів, де ефективне управління з'єднаннями є критично важливим.
Висновок
Як сталі з'єднання, так і пулінг з'єднань є потужними інструментами для оптимізації продуктивності бази даних у додатках Django. Розуміння трафіку вашого додатка та поведінки бази даних є ключовим фактором у виборі правильного підходу.
Для версій Django нижче 5, ви обмежені сталими з'єднаннями, але починаючи з Django 5.1, вбудований пулінг з'єднань надає більш надійний варіант для PostgreSQL. 🎯
Щасливого кодування! 🚀
Джерела
Перекладено з: Implementation of Connection Pooling and Persistent Connections in Django REST Projects