Пам'ятайте про все це в контексті екосистеми .Net.
Інколи розробники хочуть "оптимізувати" свій код для повторного використання об'єктів з'єднання. Зважаючи на контекст цього питання, це майже завжди є помилкою.
ADO.Net має функцію під назвою Пул з'єднання . Коли ви створюєте та відкриваєте новий об'єкт з'єднання, ви дійсно робите запит на з'єднання з пулу. Коли ви закриєте з'єднання, ви повернете його до пулу.
Важливо зрозуміти об'єкти, які ми використовуємо безпосередньо в коді: SqlConnection, MySqlConnection, OleDbConnectio тощо - це лише обгортки навколо реального базового з'єднання, яким керує ADO.Net, а реальні з'єднання ADO.Net набагато "важчі" та дорожчі з точки зору продуктивності. Саме такі основні об'єкти мають такі проблеми, як аутентифікація, транзит мережі, шифрування, і ті речі набагато переважають малу кількість пам'яті в об'єкті, який ви насправді бачите у власному коді.
При спробі повторно використовувати об’єкт підключення, ви порушуєте можливість ADO.Net ефективно керувати важливими базовими з'єднаннями. Ви отримуєте ефективність у дрібниці за рахунок значно більшої речі.
Повторне використання з'єднання через додаток або запит http також може змусити вас випадково серіалізувати щось, що інакше могло б працювати паралельно, і стати вузьким місцем продуктивності. Я бачив, як це відбувається в реальних програмах.
У випадку прикладу веб-сторінки тут, де ви принаймні зберігаєте лише невелике з'єднання протягом тривалості одного запиту / відповіді http, ви можете отримати ще більшу ефективність, оцінивши, які запити виконуються у вашому конвеєрі запитів, і спробуйте отримати їх можна зменшити до якомога менше окремих запитів до бази даних (підказка: ви можете подати більше одного запиту в одну рядок SQL та використовувати DataReader.NextResult()
або перевіряти різні таблиці, DataSet
щоб переходити між ними).
Іншими словами, замість того, щоб думати з точки зору повторного використання одного з'єднання для програми або http-запиту проти одного з'єднання на запит, продумайте терміни одного з'єднання кожного разу, коли ви звертаєтесь до бази даних ... кожну туру. Потім спробуйте мінімізувати кількість з'єднань, мінімізуючи кількість цих поїздок. Таким чином ви можете задовольнити обидві цілі.
Але це лише один вид оптимізації. Також є оптимізація програмного часу та отримання ефективного повторного використання коду. Розробники не хочуть знову і знову писати один і той же код котла, щоб отримати об'єкт підключення, відкритий і готовий до використання. Це не тільки нудно, це спосіб ввести помилки в програму.
Навіть тут, однак, краще мати одне з'єднання за запитом (або в обидва кінці). Існують і інші зразки, які можна використовувати, щоб уникнути повторного запису того ж кодового коду. Ось один приклад, який мені подобається, але є багато інших.