Правильная абстракция уровня базы данных в 3-уровневой системе? - PullRequest
4 голосов
/ 30 марта 2010

Я создаю 3-х уровневое приложение. В основном это идет

Клиент -> (через дополнительный сервер для быть тонким клиентом) -> Бизнес-логика -> Уровень базы данных

И, по сути, делаю так, чтобы не было никаких пропусков. Поэтому я хочу, чтобы все SQL-запросы и тому подобное находились на уровне базы данных.

Ну, теперь я немного запутался. Я создал несколько статических классов, чтобы начать с уровня базы данных, но что мне делать для соединений с базой данных? Должен ли я просто создать новое соединение с базой данных каждый раз, когда я захожу на уровень базы данных, или это будет расточительно? Connection.Open () занимает время, когда у вас есть ConnectionPool?

Мне кажется, что бизнес-уровень просто не может передать объект IdbConnection на уровень базы данных. Кажется, что уровень базы данных должен обрабатывать весь этот специфичный для БД код. Как вы думаете? Как я могу сделать это правильно, оставаясь практичным?

Ответы [ 5 ]

2 голосов
/ 30 марта 2010

Из-за ConnectionPool открывайте новое соединение каждый раз, когда вы обращаетесь к БД, обычно это не проблема.

Если вы можете повторно использовать открытое соединение, не оставляя соединения открытыми в течение длительного времени, и не рискуя оставить осиротевшие открытые соединения , то повторное использование открытых соединений не повредит. (Я фактически внедряю datatool во все мои классы, которые обращаются к БД. Это в основном для целей модульного тестирования, но также позволяет мне при желании держать соединение открытым для использования несколькими вызовами к БД.)

Но опять же, вы не должны слишком сильно беспокоиться об открытии / закрытии большого количества соединений. важнее , что ваш DAL:

  • ремонтопригоден, прост, гибок
  • работает как можно лучше
  • (самое главное) всегда правильно располагает своих соединений.
2 голосов
/ 30 марта 2010

Традиционно отдельный «Уровень доступа к данным» предоставляет контекст базы данных для извлечения и фиксации данных. Для этого есть несколько известных шаблонов, таких как Repository. ADO.NET реализует несколько других, таких как Provider.

Entity Framework и LINQ to SQL также являются хорошими вариантами для дальнейшей инкапсуляции и упрощения изоляции уровня данных.

2 голосов
/ 30 марта 2010

Вы можете создать класс (или пространство имен классов, в зависимости от размера) для размещения слоя базы данных. Внутри вашего класса базы данных вы должны просто использовать пул соединений на уровне базы данных. В пуле будет сохранено n подключений к базе данных в любой момент времени, поэтому вы можете просто выполнить запрос, используя одно из подключенных к пулу подключений, без значительных накладных расходов.

С этим на вашем уровне базы данных должен быть представлен "API" открытых методов, в которые бизнес-уровень может обращаться. Ни один из этих методов не должен предоставлять объект подключения к базе данных - эти данные являются внутренними для уровня данных.

Затем с вашего бизнес-уровня просто вызывайте «API» уровня базы данных каждый раз, когда вам нужно выполнить запрос.

Это помогает?

2 голосов
/ 30 марта 2010

Можно создавать и открывать новое соединение каждый раз, когда вы входите в слой базы данных, и закрываете соединение, как только закончите с ним. .Net / Sql Server достаточно хорошо обрабатывает пул соединений, чтобы это можно было сделать, и это приемлемый способ сделать это.

Вы также правы в том, что не передавали строку подключения с бизнес-уровня. Это должен быть частный (но настраиваемый) элемент уровня данных.

2 голосов
/ 30 марта 2010

Открывайте соединение только тогда, когда вам это нужно. Не поддерживайте соединение с базой данных, это гораздо более расточительно. Конечно, ваш уровень БД откроет соединение, я не уверен, почему вы думаете, что BLL собирается передать соединение с БД. BLL не знает о базе данных (по крайней мере, не должен), он должен обрабатывать бизнес-правила и тому подобное. Фактическое соединение открыто на уровне БД.

Вот ссылка, которая показывает, как должен выглядеть BLL:

Проверка данных в .net

Сама строка соединения должна быть просто частной строковой переменной в вашем классе слоя db, и вы должны иметь возможность извлекать информацию о строке соединения, например, из файла web.config.

...