powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
13 сообщений из 13, страница 1 из 1
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #33933526
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте уважаемые.
У меня есть два проекта. Суть работы обоих одинакова - в MS SQL 2000 хранится таблица - типа очередь и из неё периодически выбираются данные разными потоками, удаляя, либо модифицируя записи онной.
Системы работают, но крайне нестабильно, периодически начиная выводить несуразные ошибки.
Например - есть очередь, где каждая запись отображает состояние. Их десять. Паралельно работают потоки, выбирающие записи по запросу: "select top 50 Column1, Column2, Column3 from TableTest where Thread = [номер потока] order by DateStatus". ТАк вот - когда приложение запущено - записи возвращаются через раз. Пробовал читать результаты как ридером, так и грузить их Fill'ом в DataSet. Ошибки тут таковы - то возвращаются 50 записей, то 0. Profiler вешал на запросы - запросы приходят и данные судя по всему возвращаются запрашивающему приложению, но Rows.Count или HasRows (с ридером) показывают - что в возвращённой выборке - 0 записей. with(nolock) не помогает. Причём это совсем хаотично. В режиме отладчика ещё наблюдалась такая ситуация - возвращались совсем не те столбцы, что указаны в селекте или не доставало части из них. Это я грешу на ошибки именно отладчика. В релизной компиляции они почему то не возникают. Также сделал приложение тестовое - с одним селектом - работает как надо. Запустил 6 его копий паралельно - ни одного затыка не было.
Также хочу заметить - изоляция потоков друг относительно друга - полная. Они нигде не пересекаются по части общих переменных.
Также - вылетают в ошибки запросы к хранимым процедурам. Причём ошибки разнообразные - то NULL вернётся, когда в реале не NULL должен быть возвращён, то пишет, что ошибка "Procedure or function sp_SendWith has too many arguments specified", причём - ничего не менялось. тоесть - работает себе многопоточно эта программулина два дня, и тут оба - и пошла эта ошибка. Останавливаю. Запускаю под отладчиком - есть ошибка. Удаляю процедуру и прописываю вновь - работает. Тоесть - я вобще логического объяснения не вижу.
ПОМОГИТЕ - что я делаю не так?
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #33947649
Фотография Лиман Артём
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мда полгода - это срок. Что либо сказать, не видя самого приложения, не реально.
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #33970532
eLVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здраствуйте.
Я, конечно, специалист не бог весть какой, но вот это меня смутило (может более опытные меня поправят)

"select top 50 Column1, Column2, Column3 from TableTest where Thread = [номер потока] order by DateStatus"

Я бы посмотрел в сторону Service Broker
Удачи.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34204731
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это снова я. Проблема до сих пор не понеятна. Решение для себя нашёл такое - что делаю один общий класс, который работает с MS SQL. Для каждой комманды свой класс с определённым абстрактным классом предком. Выполнение всех процедур и запросов идёт через одну "дыру". Чтобы в эту "дыру" не лезли сразу два запроса - использую lock (возможно - его разумнее заменить на что либо другое). Ошибки сразу прекратились. Но решение не удобное. Потому что приходится писать много кода вручную + для Оракла надо делать отдельные классы или усложнять объектную модель (правда я с ним такой ошибки пока не наблюдал. Возможно, потому что не так интернсивно его имею). Скорость работы такого решения вполне приемлемая, но понимаю, что изобретаю велосипед. Может это какая то реальная ошибка самого Fraemwork 2? или драйверов работы с MS SQL (2000). Ведь так хочется - набросать запросы визуально и использовать их в разных потоках. Общих переменных в потоках нет, но при многопоточности и большом количестве запросов - приложение в конце концов падает. Заметил это и на ASP.NET и в windows приложениях. ASP.NET начинает дохнуть аналогично. Опция <legacyUnhandledExceptionPolicy enabled="true" /> видимого эффекта не приносит. Может кто нибудь подскажет - как правильно работать в многопоточном приложении с БД? Книги читал, форум весь облазил, но так и не нашёл - почему же работа с БД сбоит. Хочу заметить про нагрузки: Количество потоков: до 15, количество запросов в минуту - до 200 (х.п. и селекты).
Моделировать эту ошибку можно следующим образом: создать многопоточное приложение. Сделать различных хранимых процедур визуально. Потом их интенсивно пользовать, создав в каждом потоке свой экземпляр MSSQLTableAdapters.QueriesTableAdapter. В конце концов начнутся "чудеса" - будут возвращаться "левые" значения(для селектов), либо null (для х.п.). Лечится это, если в файле MSSQL.Designer.cs поставить lock на каждую процедуру.
Хелп!!!
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34204734
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение: статических классов нет, и методов.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34205071
+2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
+2
Гость
авторМоделировать эту ошибку можно следующим образом: создать многопоточное приложение. Сделать различных хранимых процедур визуально. Потом их интенсивно пользовать, создав в каждом потоке свой экземпляр MSSQLTableAdapters.QueriesTableAdapter. В конце концов начнутся "чудеса" - будут возвращаться "левые" значения(для селектов), либо null (для х.п.). Лечится это, если в файле MSSQL.Designer.cs поставить lock на каждую процедуру.

Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34205784
Tima2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты случаем для своих разных потоков не один SqlConnection используешь? :)

С уважением, Тима2010.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34206191
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLConnection для каждой строки свой.

Выдержка из MSSQL.Designer.cs:
this._commandCollection[0] = new System.Data.SqlClient.SqlCommand();
((System.Data.SqlClient.SqlCommand)(this._commandCollection[0])).Connection = new System.Data.SqlClient.SqlConnection(global::MurderOldDll.Properties.Settings.Default.SQLConnectionString);
((System.Data.SqlClient.SqlCommand)(this._commandCollection[0])).CommandText = "dbo.sp_CheckTelnetUser";

Тоесть - есть набор комманд и для каждой комманды своё соединение.


>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
Кто сталкивался с подобной проблемой - поймёт то, что я написал.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34206463
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Foks
Код: plaintext
... from TableTest where Thread = [номер потока] order by ...

На основании каких умозаключений Вы решили, что номер потока - величина постоянная?
Хеш объекта Thread - вот что постоянно и поведение однозначно описано в MSDN, а про номер потока так и говорится:
MSDNAn operating-system ThreadId has no fixed relationship to a managed thread, because an unmanaged host can control the relationship between managed and unmanaged threads. Specifically, a sophisticated host can use the CLR Hosting API to schedule many managed threads against the same operating system thread, or to move a managed thread between different operating system threads.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34206472
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
Кто сталкивался с подобной проблемой - поймёт то, что я написал.
Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь...
Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34209184
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman S. Golubin _Foks
Код: plaintext
... from TableTest where Thread = [номер потока] order by ...

На основании каких умозаключений Вы решили, что номер потока - величина постоянная?
Хеш объекта Thread - вот что постоянно и поведение однозначно описано в MSDN, а про номер потока так и говорится:
MSDNAn operating-system ThreadId has no fixed relationship to a managed thread, because an unmanaged host can control the relationship between managed and unmanaged threads. Specifically, a sophisticated host can use the CLR Hosting API to schedule many managed threads against the same operating system thread, or to move a managed thread between different operating system threads.

На основании того, что каждый поток, отдельный класс и имеет константу. Есть класс Thread1. В нём const readonly int Thread = 1, а в классе Thread2 эта константа равна двум. Так что могу с уверенностью сказать - величина постоянная. Каждый поток обрабатывает определённое состояние. Есть граф переходов.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34209187
_Foks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman S. Golubin _Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
Кто сталкивался с подобной проблемой - поймёт то, что я написал.
Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь...
Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же.

Значит никто не сталкивался :-)
Понимаю, что надо бы сделать тестовую среду и опубликовать её. Думал, что тех данных, что я привёл - будет достаточно. Если их не хватит и я ещё полгода не найду ответа - займусь сооружением комплекса для тестирования.
...
Рейтинг: 0 / 0
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
    #34219804
Tima2010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_FoksSQLConnection для каждой строки свой.

Выдержка из MSSQL.Designer.cs:
Код: plaintext
   this._commandCollection[ 0 ] = new System.Data.SqlClient.SqlCommand();


1. А вот то что указывается 0 в качестве индекса, а не переменная? Каждый поток
инициализируется копипастом?

2. При выполнении программы, сколько MSSQL показывает подключений?


С уваженим, Tima2010
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]