Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 20385|Відповідь: 0

[Джерело] ADO.NET Туторіал (5) Детально поясніть пул з'єднань з базою даних

[Копіювати посилання]
Опубліковано 17.09.2016 15:41:28 | | | |
Анотація
Сьогодні я поговорю про пули підключення до баз даних. Чесно кажучи, я казав, що качка груша дуже велика. Тому що пули зв'язків відносно складніші для розуміння порівняно з іншими главами. Я хочу пояснити це найпопулярнішими реченнями, але це нелегке завдання. Однак пули з'єднань також є дуже важливим пунктом знань, особливо при розгортанні багатокористувацьких програм. Тому я маю не лише говорити, а й говорити ґрунтовно. У цій статті ви зрозумієте основи пулювання з'єднань і те, як це вже використовується для покращення продуктивності вашого додатку.

Зміст
Що таке пул з'єднань?
Як працює пул з'єднань
Давайте поговоримо про кілька дуже важливих властивостей пулів з'єднань
Винятки пулу з'єднань та методи обробки
Спосіб моніторити стан вашого з'єднання
Основні принципи ефективного використання пулів з'єднань
1. Що таке пул з'єднань?
      У попередній статті «ADO.NET ви повинні знати (4) об'єкти зв'язку зі смаком» я наголошував, що встановлення зв'язку з базою даних — це дуже трудомістка (тривала) та трудомістка (ресурсомістка) справа. Це пов'язано з тим, що підключення до сервера бази даних включає кілька тривалих процесів: встановлення фізичного каналу (наприклад, сокета або іменованого конвеєра), початкове рукостискання з сервером, аналіз інформації про рядок з'єднання, автентифікацію сервером, запуск перевірки для реєстрації у поточній транзакції тощо. Незалежно від причин існування такого механізму, завжди існує причина існування. Оскільки створення нового зв'язку так болісне, чому б не використати існуючий?

      Насправді ADO.NET вже дає нам метод оптимізації, який називається пул з'єднань. Пул з'єднань — це один із таких контейнерів: він містить певну кількість фізичних з'єднань із сервером бази даних. Тому, коли потрібно підключитися до сервера бази даних, потрібно лише взяти вільне з'єднання з пулу (контейнера) замість створення нового. Це значно зменшує накладні витрати на підключення до бази даних, що покращує продуктивність додатку.

PS:本来做了2张图片来描述连接池的,无奈公司装有监控软件,不能上传,所以只能等下次有时间上传了。



2. Як працює пул з'єднань
2.1 Створення пулу з'єднань
      Слід зазначити, що пули з'єднань чутливі до класу. Тобто, одна й та сама область застосування може мати кілька різних типів пулів з'єднань одночасно. Отже, як ідентифікують пули з'єднань? Детально його розрізняє підпис, що формує процес, домен додатку, рядок з'єднання та ідентифікатор Windows (при використанні інтегрованої безпеки). Однак для тієї ж області застосування він зазвичай ідентифікується лише рядком з'єднання. Коли з'єднання відкривається, створюється новий пул з'єднань, якщо типовий підпис стрічкового з'єднання не відповідає типу існуючого пулу з'єднань. інакше новий пул з'єднань не створюється.

      Типовий приклад створення зв'язку:


У наведеному вище випадку я створив три об'єкти SqlConnection, але для їх керування потрібно було лише два пули з'єднань. Уважні, друзі, можливо, ви вже з'ясували, що conn1 і conn3 мають однаковий рядок з'єднання, тому вони можуть ділити пул з'єднань, тоді як conn2 і conn1 відрізняються від conn3, тому потрібно створити новий пул підключень.

2.2 Розподіл з'єднань у режимі простою
      Коли користувач створює запит на з'єднання або викликає об'єкт Open of a Connection, менеджер пулу з'єднань спочатку має знайти пул з'єднань відповідного типу на основі підпису запиту на з'єднання, а потім спробувати виділити вільне з'єднання. Деталі такі:

Якщо в пулі є доступне з'єднання, поверніть це з'єднання.
Якщо всі з'єднання в пулі вичерпані, створіть нове з'єднання для додавання до пулу.
Якщо досягнуто максимальної кількості з'єднань у пулі, запит потрапляє в чергу очікування, доки не з'являться вільні з'єднання.
2.3 Видалення недійсних з'єднань
      Недійсні з'єднання, тобто з'єднання, які неправильно підключаються до сервера бази даних. Для пулів з'єднань кількість з'єднань, збережених до сервера бази даних, обмежена. Отже, якщо некоректні з'єднання не видаляються вчасно, простір у пулі з'єднань буде марно. Насправді, вам не варто хвилюватися, менеджер пулу з'єднань дуже добре вирішив ці проблеми для нас. Якщо з'єднання тривалий час перебуває без активності або виявляє, що з'єднання з сервером розірване, менеджер пулу з'єднань видаляє це з'єднання з пулу.

2.4 Використані з'єднання для переробки
      Коли ми закінчуємо користуватися з'єднанням, ми повинні вчасно його закрити або відпустити, щоб з'єднання можна було повернути в пул для повторного використання. Ми можемо закрити з'єднання за допомогою методу Close або Dispose об'єкта Connection або через оператор using у C#.



3. Розкажіть про кілька дуже важливих рис
Поведінку пулу з'єднань можна контролювати за допомогою рядків з'єднання і вона включає чотири важливі властивості:

Тайм-аут з'єднання: Час, коли запит на з'єднання чекає тайм-ауту. За замовчуванням 15 секунд у секундах.
Максимальний розмір пулу: Максимальна кількість з'єднань у пулі з'єднань. За замовчуванням — 100.
Мінімальний розмір пулу: Мінімальна кількість з'єднань у пулі з'єднань. За замовчуванням — 0.
Pooling: 是否启用连接池。ADO.NET默认是启用连接池的,因此,你需要手动设置Pooling=false来禁用连接池。
Візьмемо приклад, щоб зрозуміти властивості пулу з'єднань. Код виглядає так:

4. Винятки пулу з'єднань та методи обробки
      Коли користувач відкриває з'єднання, не закривши його правильно або вчасно, це часто викликає проблему «витоку з'єднання». Витік з'єднання залишається відкритим, доки не буде викликано метод Dispose, після чого Garbage Collector (GC) не закриється і не розблокує з'єднання. На відміну від ADO, ADO.NET потрібно закривати використані з'єднання вручну. Важливим міфом є те, що зв'язок закривається, коли з'єднаний об'єкт знаходиться поза локальним діапазоном. Насправді, коли він поза межами дії, звільняється лише об'єкт з'єднання, а не ресурс з'єднання. Давайте спочатку розглянемо приклад.

Щоб результати були очевиднішими, я спеціально встановив максимальну кількість з'єднань на 5, а час тайм-ауту — 1 секунда. Після запуску швидко отримують наступні результати.


З наведених вище результатів очевидно, що існує аномалія у зв'язку. Ми вже знаємо, що максимальна кількість з'єднань у пулі з'єднань становить 5, і коли створюється 6-те з'єднання, потрібно чекати на його тайм-аут, оскільки максимальна кількість з'єднань у пулі з'єднань досягла максимальної кількості, а вільних з'єднань немає. Коли час тайм-ауту перевищується, з'являється згаданий вище виняток з'єднання. Тому мушу ще раз підкреслити, що використані з'єднання слід належним чином закрити та звільнити якомога швидше.



5. Методи моніторингу стану з'єднань SQL Server
(1) Через монітор активності
Крок 1: Відкрийте менеджер MSSMS і натисніть іконку «Монітор активності».



Крок 2: У режимі «Відкрити монітор активності» натисніть вкладку «Процеси».



Крок 3: Запустіть приклад у розділі #4 Exceptions Pool та Handling Methods, ви можете побачити 5 відкритих з'єднань, як показано на рисунку нижче.



(2) Використовуйте оператори T-SQL
Так само, виконуючи системну збережену процедуру sp_who ми можемо також відстежувати стан з'єднання.






6. Основні принципи ефективного використання пулів з'єднань
      Ефективне використання пулу з'єднань значно покращить продуктивність вашого додатку. Навпаки, якщо використовувати її неправильно, вона не завдасть шкоди. Загалом слід дотримуватися наступних принципів:

Запитуйте зв'язок у найпізніший момент, розпустіть його якомога швидше.
Коли ви закриваєте з'єднання, спочатку закривайте відповідну транзакцію, визначену користувачем.
Переконайтеся, що хоча б одне відкрите з'єднання у пулі підключень.
Намагайтеся уникати сміття в басейні. Це переважно включає фрагментацію пулу, створену інтегрованою безпекою, та фрагментацію пулу, створену за допомогою багатьох баз даних.
Порада: Фрагментація пулу є поширеною проблемою у багатьох веб-додатках, і застосунки можуть створювати велику кількість пулів, які не випускаються до завершення процесу. Таким чином відкривається велика кількість з'єднань, що займає багато пам'яті, що призводить до зниження продуктивності.





Попередній:.net/c# генерує випадкові числа, власні літери та цифри
Наступний:Як налаштувати HttpOnly для файлів cookie? Для чого використовується HttpOnly?
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com