Обработка нескольких вызовов BeginExecuteNonQuery в SQL Server 2008 - PullRequest
0 голосов
/ 11 июня 2009

У меня есть приложение, которое получает большой объем данных, которые я хочу сохранить в базе данных. Моя текущая стратегия - запускать асинхронный вызов (BeginExecuteNonQuery) с каждой записью, когда она будет готова. Я использую асинхронный вызов для обеспечения бесперебойной работы остальной части приложения.

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

  1. Буферизуйте ожидающие данные самостоятельно, пока существующая команда не будет завершена.
  2. При необходимости откройте несколько соединений.

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

Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 11 июня 2009

В зависимости от вашей стратегии блокировки, возможно, стоит использовать несколько соединений, но определенно не число «без верхних границ». Таким образом, хорошей стратегией / шаблоном для использования здесь является «пул потоков» , где каждый из N выделенных потоков удерживает соединение и принимает запросы на запись по мере поступления запросов, а поток завершает предыдущий, который он выполнял. Количество потоков в пуле для лучшей производительности лучше всего определять опытным путем, сравнивая различные возможности в реалистичной экспериментальной / прототипной обстановке.

Если очередь в «буфере» (в которой очереди вашего основного потока пишут запросы, а выделенные потоки в пуле их отбирают) возрастает за определенный порог, это означает, что вы получаете данные быстрее, чем вы можете их записать Таким образом, если вы не сможете получить больше ресурсов, вам просто придется отбросить некоторых входящих данных - возможно, с помощью стратегии случайной выборки, чтобы избежать смещения будущего статистического анализа. Просто посчитайте, сколько вы пишете и сколько вам приходится отбрасывать из-за нехватки ресурсов в каждый период времени (скажем, каждую минуту или около того), чтобы вы могли использовать методы «стратифицированной выборки» в будущих исследованиях по извлечению данных. .

0 голосов
/ 11 июня 2009

Спасибо, Алекс, - тогда вы бы предложили гибридный метод, предполагая, что мне все еще нужно будет буферизовать обновления, если все соединения используются?

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

...