C # Как реализовать базу данных, которая запрашивается потоками - PullRequest
0 голосов
/ 12 ноября 2010

Привет, у меня есть ситуация, когда юридические лица являются клиентом и поставщиком склада клиента. мои цели:

  1. склад синглетный и открыт дБ во время выполнения.
  2. customerManager управляет клиентами как потоками, которые запрашивают склад и обновляют его (после покупки персонала).
  3. когда один из товаров на складе заканчивается, мы просим поставщика в другом потоке предоставить его нам, пока поставщик делает свое дело (предположим, что это примерно 5 секунд), клиент ждет (в очереди) и вызывается, когда метод поставщика вернул true (допустим, он всегда возвращает true) ..

поэтому мои вопросы касаются трех вещей:

  1. дизайн - должен ли клиент-менеджер держать внутри себя склад и клиентов? это похоже на лучшую душу, кто-то рекомендует иначе? (тема дизайна c #)

  2. сколько потоков может идти в базу данных одновременно? может ли БД справиться с этим сам, поэтому мне не нужно делать это самому? я должен держать для них SqlCommand (s)? я должен использовать набор данных или datareader? другими словами Может кто-нибудь посоветовать мне, как это сделать? Должен ли я сделать для 10 потоков:

     for (int i = 0 ; i < 10 ; i++)
    {
        SqlConnection sqlConnection = new SqlConnection(r_ConnectionString);      
        sqlConnection.Open();
        sqlConnection.Close();
    }
    

... значит, пул соединений будет открыт для 10 соединений?

** база данных ADO.NET ** тема

  1. как потоки должны ждать в очереди? (Чтобы ждать, пока метод поставщика разбудит их), как их разбудить? Есть ли хорошее решение в C # для этого? (тема темы c #)

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

спасибо.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Ваши рабочие потоки могут работать через BlockingCollection или ConcurrentQueue .

Для управления соединением вам лучше сделать это:

using (SqlConnection conn = new SqlConnection(...))
{
}

, поскольку это гарантирует, что Dispose() будет вызван для вас. Как отмечалось в других отзывах, вы можете делать это, не беспокоясь о фактическом количестве подключений к БД, поскольку ADO.Net управляет пулом физических соединений за кулисами.

Никто не может сказать вам, работает ли DataSet или DataReader лучше всего, это зависит от того, как вы используете данные после их загрузки. DataReader обеспечивает последовательное чтение каждой записи по очереди, тогда как DataSet обеспечивает кэш в памяти данных базовой БД и в этом смысле является абстракцией «более высокого уровня».

0 голосов
/ 12 ноября 2010

SqlConnections реализуются в .net с использованием пула соединений.Вам не нужно беспокоиться об управлении самими соединениями.Единственное требование к вам заключается в том, что после того, как вы их откроете, вы позвоните .close..net будет управлять остальным для вас эффективным способом.

Если вы хотите выполнить несколько запросов одновременно, вы можете вызвать sqlcommand с begin invoke и end invoke.

Используя обаэти вы не можете работать на уровне, который не требует от вас управления потоками во время получения многопоточного поведения.

Однако вы должны прочитать ADO.Net, потому что многое из того, о чем вы говорите, не нужно, когда вы знаете, как это работает.

как для набора данных или устройства чтения данных, которое зависит от вашей проблемы,Набор данных является очень тяжелым объектом, хотя устройства чтения данных легкие и быстрые, что позволяет довольно легко заполнять коллекцию.

Я предпочитаю использовать linq2sql или каркас сущностей.ADO.Net довольно хрупок, потому что вам приходится много работать с данными и вручную отображать объекты, которые подвержены ошибкам во время выполнения, а не во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...