|
|
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Здравствуйте уважаемые. У меня есть два проекта. Суть работы обоих одинакова - в 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", причём - ничего не менялось. тоесть - работает себе многопоточно эта программулина два дня, и тут оба - и пошла эта ошибка. Останавливаю. Запускаю под отладчиком - есть ошибка. Удаляю процедуру и прописываю вновь - работает. Тоесть - я вобще логического объяснения не вижу. ПОМОГИТЕ - что я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2006, 07:43 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
мда полгода - это срок. Что либо сказать, не видя самого приложения, не реально. _______________________________________________________ Never ask users what they want, or they'll tell you. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2006, 17:35 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Здраствуйте. Я, конечно, специалист не бог весть какой, но вот это меня смутило (может более опытные меня поправят) "select top 50 Column1, Column2, Column3 from TableTest where Thread = [номер потока] order by DateStatus" Я бы посмотрел в сторону Service Broker Удачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2006, 12:43 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Это снова я. Проблема до сих пор не понеятна. Решение для себя нашёл такое - что делаю один общий класс, который работает с 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 на каждую процедуру. Хелп!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2006, 09:55 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Дополнение: статических классов нет, и методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2006, 09:57 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
авторМоделировать эту ошибку можно следующим образом: создать многопоточное приложение. Сделать различных хранимых процедур визуально. Потом их интенсивно пользовать, создав в каждом потоке свой экземпляр MSSQLTableAdapters.QueriesTableAdapter. В конце концов начнутся "чудеса" - будут возвращаться "левые" значения(для селектов), либо null (для х.п.). Лечится это, если в файле MSSQL.Designer.cs поставить lock на каждую процедуру. Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2006, 18:01 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
А ты случаем для своих разных потоков не один SqlConnection используешь? :) С уважением, Тима2010. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2006, 16:45 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
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"; Тоесть - есть набор комманд и для каждой комманды своё соединение. >Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так? Кто сталкивался с подобной проблемой - поймёт то, что я написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 04:18 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
_Foks Код: plaintext На основании каких умозаключений Вы решили, что номер потока - величина постоянная? Хеш объекта 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 10:09 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
_Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так? Кто сталкивался с подобной проблемой - поймёт то, что я написал. Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь... Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2006, 10:13 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Roman S. Golubin _Foks Код: plaintext На основании каких умозаключений Вы решили, что номер потока - величина постоянная? Хеш объекта 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 эта константа равна двум. Так что могу с уверенностью сказать - величина постоянная. Каждый поток обрабатывает определённое состояние. Есть граф переходов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 04:46 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
Roman S. Golubin _Foks>Сделал все как Вы сказали. Получаю "Ошибка в семнадцатой строке". Что я делаю не так? Кто сталкивался с подобной проблемой - поймёт то, что я написал. Что-то сомнения берут, учитывая, что полгода ни кто не может Вам помочь... Вот тут вот описаны рекомендации, как задавать вопросы, правда не совсем для конкретно этого форума, но смысл остается тот же. Значит никто не сталкивался :-) Понимаю, что надо бы сделать тестовую среду и опубликовать её. Думал, что тех данных, что я привёл - будет достаточно. Если их не хватит и я ещё полгода не найду ответа - займусь сооружением комплекса для тестирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2006, 04:50 |
|
||
|
Пол года не могу попбороть проблему: очереди, многопоточность: C# (VS 2005) + SQL 2000
|
|||
|---|---|---|---|
|
#18+
_FoksSQLConnection для каждой строки свой. Выдержка из MSSQL.Designer.cs: Код: plaintext 1. А вот то что указывается 0 в качестве индекса, а не переменная? Каждый поток инициализируется копипастом? 2. При выполнении программы, сколько MSSQL показывает подключений? С уваженим, Tima2010 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2006, 18:34 |
|
||
|
|

start [/forum/topic.php?fid=17&msg=33947649&tid=1353011]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
104ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 453ms |

| 0 / 0 |
