|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Vadim RomanenkoСобственно, сейчас работа идет через OleDb (OleDbCommand) У Вас в try что записано? Прямо копи-пастом из msdn? // Start a local transaction with ReadCommitted isolation level. transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted); В случае срыва через 30 секунд блокировки Вы что делаете в catch (Exception ex)? Выложите свой код на C#! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:37 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, не все так просто. Но основные моменты попробую осветить Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
где BuildParameters - просто формирует набор OleDbParameter ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:42 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Ах, да, про try Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Хотя, скорее всего, это уже лишнее. Отмечу только, что responce не содержит сообщения об ошибке. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:45 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Vadim Romanenko, "DBUtils.ExecSQL" - это что за ерунда такая? DBUtils - это же JDBC, откуда он в C#? Внутренний компонент как черный ящик с передачей параметров conn as OleDbConnection, null, "exec sq_WSGetAppByLegId ?", new object[] { legId }), а внутри try и catch как угодно написаны? Что за второй параметр, почему null? В компоненте не настраивается уровень изоляции для Connection? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:48 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, Понял. Это идет вызов вот отсюда. OleDbTransaction как null. public static OleDbDataReader ExecSQL(OleDbConnection conn, OleDbTransaction trans, string sql, object[] parameters) { OleDbCommand oleCmd = new OleDbCommand(sql); oleCmd.CommandTimeout = 300; oleCmd.Connection = conn; BuildParameters(oleCmd, parameters); if (conn.State == ConnectionState.Closed) conn.Open(); if (trans != null) oleCmd.Transaction = trans; return oleCmd.ExecuteReader(CommandBehavior.Default); } Сейчас разберемся дальше, что делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:52 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, это самописная утилита. Метод которой на вход получает несколько параметров: - connection - transaction (can be null) - маску вызова (из серии "exec some_sp ?, ?") - массив значений параметров хранимой процедуры В данном случае объект транзакции пустой. Подключение к БД устанавливается на основе connection string. Из "подозрительного" там имеются следующие параметры: - Persist Security Info=False; - multipleactiveresultsets=True; - Enlist=false; Все остальное - я вроде бы привел ПС: совпадение названия утилиты с какими-то существующими "в стороне" - исключительно случайное :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:54 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, Мой главный вопрос - есть ли возможность создать честный параллельный thread, в который я бы перенес код обработки. При этом чтобы метод веб сервиса вернул управление вызвавшей его хранимой процедуре. Самый логичный способ решения этой проблемы, на самом деле - был подсказан уже кем-то. Это сделать нотификацию на клиенте. После явного коммита в том самом клиенте. Но этот способ очень не хочется осуществлять - в связи с необходимостью провести обновление клиентского приложения у всех заказчиков. Основная проблема в административных трудностях. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 19:57 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAPAndy_OLAP, Понял. Это идет вызов вот отсюда. OleDbTransaction как null. public static OleDbDataReader ExecSQL(OleDbConnection conn, OleDbTransaction trans, string sql, object[] parameters) { OleDbCommand oleCmd = new OleDbCommand(sql); oleCmd.CommandTimeout = 300; oleCmd.Connection = conn; BuildParameters(oleCmd, parameters); if (conn.State == ConnectionState.Closed) conn.Open(); if (trans != null) oleCmd.Transaction = trans; return oleCmd.ExecuteReader(CommandBehavior.Default); } Сейчас разберемся дальше, что делать. Идет вызовconn.Open(); Далее сразу на oleCmd выполняется ExecuteReader. А нужно вставить далее например что-то типа oleCmd.Transaction = onn.BeginTransaction(level, "DirtyReadFirst"). Не силен в C#, попросите коллег подсказать, как задавать уровни изоляции (а точнее режим блокировки транзакций для подключения) помимо дефолтного. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:03 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, спасибо за совет :) но мне нужны как раз ИЗМЕНЕННЫЕ данные из БД :) видимо, таки пойду допиливать клиентское приложение для вызова нотификации после коммита основной операции ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:06 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Vadim Romanenko- multipleactiveresultsets=True; Так у Вас же режим MARS включен. Ну и в соединение идут разные сеансы из кэша. В рамках одного сеанса ставите блокировку, в рамках другого ждете через ExecuteReader, через 30 секунд достижение лимита и создается новый сеанс без ошибки (и никакой обработки и повторной попытки) - и в рамках его команда выполняется. "Чтобы свести к минимуму затраты и повысить производительность, SqlClient кэширует сеанс режима MARS в рамках соединения. Кэш может содержать максимум 10 сеансов режима MARS. Это значение не может быть изменено пользователем. При достижении лимита сеансов создается новый сеанс - ошибка не формируется. Сам кэш и содержащиеся в нем сеансы принадлежат одному соединению, они не могут использоваться в нескольких соединениях". Ну так нормально. 30 секунд пользователи подождут. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:10 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Vadim RomanenkoAndy_OLAP, спасибо за совет :) но мне нужны как раз ИЗМЕНЕННЫЕ данные из БД :) видимо, таки пойду допиливать клиентское приложение для вызова нотификации после коммита основной операции Не нужно допиливать. Не пользуйтесь текущей conn as OleDbConnection, а создавайте явно новый conn2 as OleDbConnection внутри OleDbDataReader ExecSQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:11 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAP, А текущее предварительно закрывайте, чтобы транзакция отпустила и изменения зафиксировались. С другой стороны Вам этот ID и нужен, а для нового соединения он возможно будет другой. В общем, нужно проверять. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:14 |
|
Разное время выполнения запроса из C# и SQL Server Management Studio
|
|||
---|---|---|---|
#18+
Andy_OLAPVadim Romanenko- multipleactiveresultsets=True; Так у Вас же режим MARS включен. Ну и в соединение идут разные сеансы из кэша. В рамках одного сеанса ставите блокировку, в рамках другого ждете через ExecuteReader, через 30 секунд достижение лимита и создается новый сеанс без ошибки (и никакой обработки и повторной попытки) - и в рамках его команда выполняется. "Чтобы свести к минимуму затраты и повысить производительность, SqlClient кэширует сеанс режима MARS в рамках соединения. Кэш может содержать максимум 10 сеансов режима MARS. Это значение не может быть изменено пользователем. При достижении лимита сеансов создается новый сеанс - ошибка не формируется. Сам кэш и содержащиеся в нем сеансы принадлежат одному соединению, они не могут использоваться в нескольких соединениях". Ну так нормально. 30 секунд пользователи подождут. Вах! Спасибо, не знал. Честно говоря, даже не знаю - кто и когда добавил этот параметр в конфиг проекта(-ов). Connection String мигрирует между проектами. В любом случае. Всем еще раз огромное спасибо за помощь! Без коллективного разума я бы, наверное, эту проблему или не решил, или попал бы в дурку (в кругу очевидного-невероятного) или еще чего. Проблема решена - через вызов веб-сервиса после коммита основной операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2017, 20:40 |
|
|
start [/forum/topic.php?fid=18&msg=39546390&tid=1355394]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 249ms |
0 / 0 |