І, клас connection

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

Дізнатися все основи роботи з ADO.NET в контексті клієнтських додатків ви можете в розділі ADO.NET. Я не буду тут описувати що таке постачальники даних і що з себе представляє архітектура ADO.NET, ви повинні мати загальне уявлення про класи підключеного рівня - Connection, Command, DataReader, DataAdapter і про класи автономного рівня DataSet, DataTable, DataRow тощо . Далі я буду розглядати архітектуру ADO.NET в контексті веб-додатків ASP.NET. В якості постачальника даних я буду використовувати System.Data.SqlClient (SQL Server).

Клас Connection дозволяє встановлювати з'єднання з джерелом даних, з яким потрібно взаємодіяти. Перед тим, як можна буде робити щось ще (в тому числі витяг, видалення, вставка або оновлення даних), знадобиться встановити з'єднання. Ключові властивості і методи Connection визначені інтерфейсом IDbConnection. який реалізують всі класи Connection.

рядки з'єднань

При створенні об'єкта Connection знадобиться надати рядок з'єднання. Рядок з'єднання являє собою послідовність пар "ім'я-значення", між якими ставлять крапку з комою (;). Порядок цих налаштувань, як і регістр, не важливий. Всі разом вони вказують базову інформацію, необхідну для встановлення з'єднання.

Хоча рядки з'єднань варіюються в залежності від реляційної СУБД і використовуваного постачальника даних, кілька фрагментів інформації необхідні майже завжди; ці фрагменти описані нижче:

Сервер, на якому розміщується база даних. У прикладах далі сервер бази даних завжди розташований на тому ж комп'ютері, що і додаток ASP.NET, тому замість імені комп'ютера застосовується або псевдонім localhost, або точне ім'я сервера (в моєму випадку це ". \ SQLEXPRESS").

База даних, яку слід використовувати. Я буду використовувати тестову базу даних Northwind, яка встановлюється за умовчанням з більшістю редакцій SQL Server.

Як база даних виробляє аутентифікацію. Постачальники даних Oracle і SQL Server надають можливість вибору - застосувати певні облікові дані аутентифікації або підключитися як поточний користувач системи. Останній варіант зазвичай більш кращий, оскільки в цьому випадку не знадобиться поміщати інформацію про паролі в код або конфігураційні файли.

Наприклад, нижче показана рядок з'єднання для підключення до бази даних Northwind на поточному комп'ютері з використанням інтегрованої безпеки (тобто з доступом до бази даних від імені поточного користувача Windows):

Якщо ви користуєтеся постачальником OLE DB, то рядок з'єднання буде схожа на попередню, але додадуться додатковий параметр настройки, що ідентифікує драйвер OLE DB (Provider = MSDAORA), а для підключення до файлу бази даних Access знадобитися вказати «Provider = Microsoft.Jet.OLEDB. 4.0 ».

Якщо ви використовуєте базу даних, відмінну від SQL Server, то може виникнути необхідність проконсультуватися з документацією постачальника даних (або довідником по бібліотеці класів .NET Framework), щоб дізнатися про підтримувані значеннях рядки з'єднання. Наприклад, більшість баз даних підтримують настройку тайм-ауту з'єднання, що встановлює час очікування з'єднання в секундах до того, як повинно бути згенеровано виняток. (Для SQL Server за замовчуванням прийнято 15 секунд.)

При створенні об'єкта Connection можна передати конструктору у вигляді параметра рядок з'єднання. В якості альтернативи можна вручну встановити значення властивості ConnectionString. якщо це робиться до спроби відкрити з'єднання.

Немає причин жорстко кодувати рядок з'єднання. У файлі web.config є розділ - найкраще місце для збереження рядка з'єднання. Нижче показаний приклад:

Потім цей рядок з'єднання легко витягти на ім'я з колекції WebConfigurationManager.ConnectionStrings. За умови, що імпортовано простір імен System.Web.Configuration, для цього можна скористатися наступним оператором:

У наведених нижче прикладах передбачається, що цей рядок з'єднання додана в файл web.config.

тестування з'єднання

Після вибору рядка з'єднання управляти підключенням дуже легко - потрібно просто використовувати методи Open () і Close (). Більш того, інтерфейс IDbConnection успадкований від інтерфейсу IDisposable, який визначає який реалізує його клас як ресурс. Тому при використанні класу Connection можна застосовувати конструкцію using, не викликаючи метод Close () - як тільки компілятор досягне кінця цієї конструкції, з'єднання саме закриється.

Наведений нижче код в обробнику події Page.Load можна використовувати для перевірки з'єднання і виведення його стану в текст мітки. Щоб код працював, знадобиться імпортувати простір імен System.Data.SqlClient:

І, клас connection

При відкритті з'єднання можуть виникнути два винятки. InvalidOperationException генерується, якщо рядку підключення бракує інформації або підключення вже відкрито. SqlException генерується в разі будь-якої іншої проблеми, включаючи помилку підключення до сервера бази даних, реєстрації або доступу до певної базі даних. Оператор using звільняє використовуваний об'єкт навіть при виході з блоку в результаті генерації необробленого виключення.

Організація пулу з'єднань

Отримання сполуки вимагає невеликого, але помітного часу. У веб-додатку, в якому ефективно обробляються запити, з'єднання будуть відкриватися і закриватися нескінченно - у міру обробки нових запитів. У цьому середовищі невеликі накладні витрати на установку з'єднання стають досить відчутними, і обмежують масштабованість системи.

Одним з рішень проблеми може бути організація пулу з'єднань. Пул сполук - це практика зберігання постійного набору відкритих підключень до бази даних, що розділяються між сеансами, які використовують один і той же джерело даних. Це дозволяє уникнути необхідності в постійному створенні і знищенні з'єднань. Пули з'єднань в ADO.NET повністю прозорі для програміста, і код доступу до даних не зажадає ніяких змін. Коли клієнт запитує з'єднання, викликаючи Open (), з'єднання обслуговується безпосередньо з доступного пулу, без повторного створення. Коли клієнт звільняє з'єднання викликом Close () або Dispose () (IDisposable), воно не закривається, а повертається в пул, щоб обслуговувати наступний запит.

ADO.NET не містить механізму організації пулу з'єднань. Однак більшість постачальників даних ADO.NET реалізують деяку форму такого пулу. Постачальники даних SQL Server і Oracle пропонують власні ефективні алгоритми організації групування підключень. Ці алгоритми реалізовані повністю в керованому коді і, на противагу поширеним помилкам, не використовують служби рівня підприємства COM +. Щоб з'єднання було повторно використано в SQL Server або Oracle, рядки підключень повинні в точності збігатися. Якщо вони відрізняються хоч трохи, створюється нове підключення в новому пулі.

Пули з'єднань SQL Server і Oracle використовують механізм повнотекстового порівняння. Це означає, що будь-який мінімальна зміна в рядку з'єднання порушує пул, навіть якщо в ній просто змінюється порядок параметрів або додається додатковий пробіл в кінці. З цієї причини важливо не кодувати жорстко рядки з'єднань на різних веб-сторінках. Замість цього необхідно зберігати рядок з'єднання в одному місці - переважно в розділі файлу web.config.

В обох постачальників даних - SQL Server і Oracle - пули сполук включаються і використовуються автоматично. Однак можна також використовувати параметри рядка з'єднання для настройки розмірів пулу. Ці параметри описані в таблиці нижче:

Параметри для налаштування пулу з'єднань

Максимальна кількість з'єднань, дозволених в пулі (за замовчуванням 100). Якщо досягається максимальний розмір пулу, будь-які подальші спроби відкрити з'єднання поміщаються в чергу в очікуванні звільнень з'єднання. (Якщо час тривалістю Connection.Timeout закінчується перед тим, як звільниться таке з'єднання, виникає помилка.)

Мінімальна кількість з'єднань, які повинні залишатися в пулі (за замовчуванням 0). Це число з'єднань буде створено при першому відкритті з'єднання, що скорочує час очікування при першому зверненні

При значенні true (за замовчуванням) з'єднання виводиться з відповідного пулу або, при необхідності, створюється і додається до відповідного пул

Вказує часовий інтервал в секундах. Якщо з'єднання повернуто в пул і його час підключення перевищило зазначений час життя, воно буде знищено. За замовчуванням прийнято значення 0, що відключає таку поведінку. Це засіб зручно, коли необхідно повторно використовувати велику кількість з'єднань за раз

Нижче показаний приклад рядка з'єднання, що встановлює мінімальний розмір пулу:

Деякі постачальники включають методи для очищення пулу з'єднань. Наприклад, з SqlConnection можна викликати статичні методи ClearPool () і ClearAllPools (). При виклику ClearPool () надається об'єкт SqlConnection, і всі відповідні сполуки видаляються. ClearAllPools () очищає все пули сполук в поточному домені додатку. Формально ці методи не закривають з'єднання, вони просто позначають їх як недійсні, так що після закінчення тайм-ауту вони будуть закриті під час звичайної очищення сполук, кількома хвилинами потому.

Ця функціональність використовується рідко; зазвичай єдиний випадок, коли це має сенс - коли відомо, що пул сповнений або підключення стали недійсними (наприклад, в результаті перезапуску SQL Server), і потрібно уникнути появи помилок.

Пули з'єднань SQL Server і Oracle завжди підтримуються як частина глобальних ресурсів домена додатку. В результаті пули сполук не можуть бути повторно використані між різними веб-додатками на одному і тому ж веб-сервері або між веб-додатками і іншими додатками .NET. З тієї ж причини всі з'єднання губляться при перезапуску домену додатків. (Домени додатків перезапускати з різних причин, включаючи зміну веб-сторінки, складання або конфігураційного файлу веб-додатки. Домени додатків також перезапускати після досягнення деяких порогів; наприклад, IIS може перезапускати домен додатки, що використовує великий обсяг пам'яті або занадто багато запитів в черзі. обидва обставини можуть свідчити про деградацію продуктивності домена додатку.)

Схожі статті