Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000 / 13 сообщений из 13, страница 1 из 1
22.08.2006, 07:43
    #33933526
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Здравствуйте уважаемые.
У меня есть два проекта. Суть работы обоих одинакова - в 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
28.08.2006, 17:35
    #33947649
Лиман Артём
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
мда полгода - это срок. Что либо сказать, не видя самого приложения, не реально.
_______________________________________________________
Never ask users what they want, or they'll tell you.
...
Рейтинг: 0 / 0
07.09.2006, 12:43
    #33970532
eLVik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Здраствуйте.
Я, конечно, специалист не бог весть какой, но вот это меня смутило (может более опытные меня поправят)

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

Я бы посмотрел в сторону Service Broker
Удачи.
...
Рейтинг: 0 / 0
16.12.2006, 09:55
    #34204731
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Это снова я. Проблема до сих пор не понеятна. Решение для себя нашёл такое - что делаю один общий класс, который работает с 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
16.12.2006, 09:57
    #34204734
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Дополнение: статических классов нет, и методов.
...
Рейтинг: 0 / 0
16.12.2006, 18:01
    #34205071
+2
+2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
авторМоделировать эту ошибку можно следующим образом: создать многопоточное приложение. Сделать различных хранимых процедур визуально. Потом их интенсивно пользовать, создав в каждом потоке свой экземпляр MSSQLTableAdapters.QueriesTableAdapter. В конце концов начнутся "чудеса" - будут возвращаться "левые" значения(для селектов), либо null (для х.п.). Лечится это, если в файле MSSQL.Designer.cs поставить lock на каждую процедуру.

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

С уважением, Тима2010.
...
Рейтинг: 0 / 0
18.12.2006, 04:18
    #34206191
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
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
18.12.2006, 10:09
    #34206463
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
_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
18.12.2006, 10:13
    #34206472
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
_Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
Кто сталкивался с подобной проблемой - поймёт то, что я написал.
Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь...
Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же.
...
Рейтинг: 0 / 0
19.12.2006, 04:46
    #34209184
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
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
19.12.2006, 04:50
    #34209187
_Foks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
Roman S. Golubin _Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так?
Кто сталкивался с подобной проблемой - поймёт то, что я написал.
Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь...
Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же.

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

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


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

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


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


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