2010-09-02 4 views
1

Нужно ли нам блокировать статические методы (статический класс), когда методы сильно используются потоками? Требуется ли, когда методы Static используют ресурсы, такие как SQL Queries/StoredProcedures?Многопоточность по статическим методам/классам

Благодаря Панкай

+0

Статические методы просто выполняют хранимую процедуру, которая считывает одну или две таблицы и возвращает скалярное значение. Я тестировал свои методы с потоком потока из 2000 потоков. Он работал нормально, но когда код был перенесен в производство в реальном времени, я получил следующую ошибку: «Истекло время ожидания». Период ожидания истекал до получения соединения из пула. Возможно, это произошло из-за того, что все объединенные соединения использовались и максимальный размер пула было достигнуто ». my mehtod - статический void sting GetValueforAccount (long AccountId) {lock (object) {string value = ExecuteStoredProcedure(); return Value; }} Thnx - Panks – Panks

ответ

1

Это полностью зависит от того, что статические методы делают. Если они используют общие ресурсы (например, одно и то же соединение с SQL или изменение общей коллекции), то да, вам абсолютно нужна блокировка или что-то подобное.

Если, однако, каждый вызов метода фактически независим, не касаясь какого-либо общего измененного состояния, вам не нужна блокировка.

+0

Статические методы просто выполняют хранимую процедуру, которая читает одну или две таблицы и возвращает скалярное значение. Я проверил свои методы с потоком потока из 2000 потоков. Он работал нормально, но когда код был перенесен в производство в реальном времени, я получил следующую ошибку: «Истекло время ожидания». Период ожидания истекает до получения соединения из пула. Это могло произойти из-за того, что все объединенные соединения использовались и максимальные размер бассейна был достигнут ». мой mehtod - статической силы жала GetValueforAccount (длинный AccountId) { замок (объект) {строковое значение = ExecuteStoredProcedure(); return Value; } } Thnx – Panks

+2

@Panks: Почему у вас есть блокировка? Это означает, что ваш пул соединений в основном бесполезен - в конечном итоге вы будете использовать только одно соединение *, когда вы сможете комфортно использовать много. Тот факт, что вы все еще закончили соединение, говорит о том, что вы не можете закрывать свое соединение (то есть возвращать его в пул) при выполнении хранимой процедуры. –

+0

Привет, Джон, ты прав, это не имеет смысла теоретически. это замедлит потоки. Я удалил замки. Теперь я создаю SqlConnection и SqlCommands в разделе «Использование блока». Таким образом, мне не нужно беспокоиться о явном закрытии соединений. Сейчас он работает – Panks

0

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

Смежные вопросы