powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Разное время выполнения запроса из C# и SQL Server Management Studio
14 сообщений из 39, страница 2 из 2
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546366
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoСобственно, сейчас работа идет через OleDb (OleDbCommand)
У Вас в try что записано? Прямо копи-пастом из msdn?

// Start a local transaction with ReadCommitted isolation level.
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);
В случае срыва через 30 секунд блокировки Вы что делаете в catch (Exception ex)?

Выложите свой код на C#!
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546374
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
public static List<Appointment> GetAppByLegId(long legId)
        {
            DBConnManager manager = DBConnManager.GetDBConnManager();
            IDbConnection conn = manager.GetConnection();
            List<Appointment> apps = null;
            DebugMessageService ds = DebugMessageService.GetService();

            try
            {
                OleDbDataReader dr = null;

                using (dr = DBUtils.ExecSQL(conn as OleDbConnection, null, "exec sq_WSGetAppByLegId ?", new object[] { legId }))
                {
                    apps = ParseDBResponce_Apps(dr);
                }
            }
            finally
            {
                manager.FreeConnection(conn);
            }
            return apps;
        }

...

        public IDbConnection GetConnection()
        {
            OleDbConnection conn = null;
            try
            {
                conn = new OleDbConnection(GetConnectionString());
            }
            catch (Exception e)
            {
                return null;
            }
            return conn;
        }

        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);
        }



где BuildParameters - просто формирует набор OleDbParameter
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546375
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах, да, про 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.
        public String NotifyLegStateChanged(long legId, ILog logger)
        {
            String responce = null;

            try
            {
                String brokerEndpoint = ConfigService.GetInstance().GetBrokerEndpoint();
                if (String.IsNullOrWhiteSpace(brokerEndpoint))
                {
                    throw new Exception("Broker Endpoint is empty");
                }

                List<Appointment> apps = DALApps.GetAppByLegId(legId);
                
                if (apps == null || apps.Count == 0)
                    throw new Exception("App for Leg with ID " + legId.ToString() + " not found");

                if (!apps.Any(x => x.Legs.Any(l => l.AppLegId == legId)))
                    throw new Exception("App Leg with ID " + legId.ToString() + " not found");

                Appointment app = apps.First(x => x.Legs.Any(l => l.AppLegId == legId));
                Models.AmbDispatch.Leg leg = app.Legs.First(l => l.AppLegId == legId);
                if (!apps[0].AppIsForToday())
                    return null;
                
                responce = DALBroker.GetInstance().NotifyLegUpdated(app, leg);
            }
            catch (Exception e)
            {
                responce = "Exception in DAL.NotifyAppStateChanged: " + e.Message;
            }
            
            return responce;
        }



Хотя, скорее всего, это уже лишнее. Отмечу только, что responce не содержит сообщения об ошибке.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546381
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko,

"DBUtils.ExecSQL" - это что за ерунда такая? DBUtils - это же JDBC, откуда он в C#?
Внутренний компонент как черный ящик с передачей параметров conn as OleDbConnection, null, "exec sq_WSGetAppByLegId ?", new object[] { legId }), а внутри try и catch как угодно написаны?
Что за второй параметр, почему null? В компоненте не настраивается уровень изоляции для Connection?
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546382
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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);
}
Сейчас разберемся дальше, что делать.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546383
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

это самописная утилита. Метод которой на вход получает несколько параметров:
- connection
- transaction (can be null)
- маску вызова (из серии "exec some_sp ?, ?")
- массив значений параметров хранимой процедуры

В данном случае объект транзакции пустой. Подключение к БД устанавливается на основе connection string. Из "подозрительного" там имеются следующие параметры:
- Persist Security Info=False;
- multipleactiveresultsets=True;
- Enlist=false;
Все остальное - я вроде бы привел

ПС: совпадение названия утилиты с какими-то существующими "в стороне" - исключительно случайное :)
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546386
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

Мой главный вопрос - есть ли возможность создать честный параллельный thread, в который я бы перенес код обработки. При этом чтобы метод веб сервиса вернул управление вызвавшей его хранимой процедуре.

Самый логичный способ решения этой проблемы, на самом деле - был подсказан уже кем-то. Это сделать нотификацию на клиенте. После явного коммита в том самом клиенте. Но этот способ очень не хочется осуществлять - в связи с необходимостью провести обновление клиентского приложения у всех заказчиков. Основная проблема в административных трудностях.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546390
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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#, попросите коллег подсказать, как задавать уровни изоляции (а точнее режим блокировки транзакций для подключения) помимо дефолтного.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546391
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

спасибо за совет :) но мне нужны как раз ИЗМЕНЕННЫЕ данные из БД :) видимо, таки пойду допиливать клиентское приложение для вызова нотификации после коммита основной операции
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546392
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Romanenko- multipleactiveresultsets=True;

Так у Вас же режим MARS включен. Ну и в соединение идут разные сеансы из кэша.
В рамках одного сеанса ставите блокировку, в рамках другого ждете через ExecuteReader, через 30 секунд достижение лимита и создается новый сеанс без ошибки (и никакой обработки и повторной попытки) - и в рамках его команда выполняется.
"Чтобы свести к минимуму затраты и повысить производительность, SqlClient кэширует сеанс режима MARS в рамках соединения. Кэш может содержать максимум 10 сеансов режима MARS. Это значение не может быть изменено пользователем. При достижении лимита сеансов создается новый сеанс - ошибка не формируется. Сам кэш и содержащиеся в нем сеансы принадлежат одному соединению, они не могут использоваться в нескольких соединениях".
Ну так нормально. 30 секунд пользователи подождут.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546393
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim RomanenkoAndy_OLAP,

спасибо за совет :) но мне нужны как раз ИЗМЕНЕННЫЕ данные из БД :) видимо, таки пойду допиливать клиентское приложение для вызова нотификации после коммита основной операции
Не нужно допиливать. Не пользуйтесь текущей conn as OleDbConnection, а создавайте явно новый conn2 as OleDbConnection внутри OleDbDataReader ExecSQL.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546396
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAP,

А текущее предварительно закрывайте, чтобы транзакция отпустила и изменения зафиксировались. С другой стороны Вам этот ID и нужен, а для нового соединения он возможно будет другой. В общем, нужно проверять.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546404
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andy_OLAPVadim Romanenko- multipleactiveresultsets=True;

Так у Вас же режим MARS включен. Ну и в соединение идут разные сеансы из кэша.
В рамках одного сеанса ставите блокировку, в рамках другого ждете через ExecuteReader, через 30 секунд достижение лимита и создается новый сеанс без ошибки (и никакой обработки и повторной попытки) - и в рамках его команда выполняется.
"Чтобы свести к минимуму затраты и повысить производительность, SqlClient кэширует сеанс режима MARS в рамках соединения. Кэш может содержать максимум 10 сеансов режима MARS. Это значение не может быть изменено пользователем. При достижении лимита сеансов создается новый сеанс - ошибка не формируется. Сам кэш и содержащиеся в нем сеансы принадлежат одному соединению, они не могут использоваться в нескольких соединениях".
Ну так нормально. 30 секунд пользователи подождут.

Вах! Спасибо, не знал. Честно говоря, даже не знаю - кто и когда добавил этот параметр в конфиг проекта(-ов). Connection String мигрирует между проектами.

В любом случае. Всем еще раз огромное спасибо за помощь! Без коллективного разума я бы, наверное, эту проблему или не решил, или попал бы в дурку (в кругу очевидного-невероятного) или еще чего.
Проблема решена - через вызов веб-сервиса после коммита основной операции.
...
Рейтинг: 0 / 0
Разное время выполнения запроса из C# и SQL Server Management Studio
    #39546408
Vadim Romanenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...коллега подсказал мысль про multipleactiveresultsets=True:
"если копировал через проперти SqlServerExplorer in VS, то он действительно это дело туда лепит" (с)
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Разное время выполнения запроса из C# и SQL Server Management Studio
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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