Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверка доступности SqlConnection / 20 сообщений из 20, страница 1 из 1
14.01.2013, 14:30
    #38109251
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Есть функция, которая из массива строк Connection String выбирает первую доступную коннекцию и возвращает ее.
Там наверчено больше, но типа такого:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private SqlConnection getConnection()
{
SqlConnection sqlConnectionSelected = null;
//...
                           try
                           {
                                sconnection = searchConnections[nReturn];
                                sqlConnectionSelected = new SqlConnection(sconnection.ConnectionString);
                                sqlConnectionSelected.Open(); <----------- ! Timeout
                                break;
                            }
                            catch (Exception x)
                            {
                               ;//
                            }
return sqlConnectionSelected ;
}




Таймаут в коннекции нужен приличный, минут 5-10 для дальнейшей работы.
Массив строк берется из базы, и бывают случаи когда сервер доступен, база нет, начиная от ошибки в имени заканчивая ее каким-то состоянием, такое ловится довольно быстро и берется следующий эелемент.

Если же юзер скажем ошибсся в имени сервера, то опен() ьорчит весь таймаут, а это плохо для определения доступности данных.
Хотелось бы быстро определять. Если уменьшить таймаут, то эта коннекция уйдет для дальнейшей работы и это не хорошо, будет часто рваться по таймауту.
Пока вижу такой вариант: делать еще одну коннекцию для проверки с небольшим таймаутом, и если прошло, то закрывать и открывать реальную с большим таймаутом.
Но открытие двух коннектов как-то некрасиво и накладно...

Как можно еще решить, ваше мнение?
...
Рейтинг: 0 / 0
14.01.2013, 14:55
    #38109321
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh, класс SqlConnection и так реализует pooling. Зачем ты поверх этого еще что-то делаешь?
...
Рейтинг: 0 / 0
14.01.2013, 15:44
    #38109466
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
bazileWinnipuh, класс SqlConnection и так реализует pooling. Зачем ты поверх этого еще что-то делаешь?

ну, пока я ничего специального не делаю, нарвался на ситуацию, когда торчит на опене() и спросил ...
...
Рейтинг: 0 / 0
14.01.2013, 16:37
    #38109589
Sergey TSV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh,

А зачем вам тогда интервал соединения 5-10 минут для дальнейшей работы? Вы же уже соединились. Что потом требуется?
...
Рейтинг: 0 / 0
14.01.2013, 17:54
    #38109733
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Sergey TSVWinnipuh,

А зачем вам тогда интервал соединения 5-10 минут для дальнейшей работы? Вы же уже соединились. Что потом требуется?

Это сервис, он делает:

1. забрать массив Connecton String[]
2. взять очередную строку из массива, если есть, иначе гоуту 9.
3. (попытаться) открыть коннекцию используя строку из массива
4. если не открывается, то гоуту на п.2.,
5. выполнить процедуру (она может выполняться 10-60 сек)
6. забрать результат
7. закрыть
8. отдать результат клиенту
9. ретурн


в п.5. если таймаут будет маленький обломается
Но если он будет большой в п. 3, то придется торчать весь таймаут в некоторых случаях
...
Рейтинг: 0 / 0
14.01.2013, 18:01
    #38109755
beg-in-er
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh5. выполнить процедуру (она может выполняться 10 -60 сек )что ж за мешки вы ворочаете?
...
Рейтинг: 0 / 0
14.01.2013, 18:10
    #38109770
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh, о каком, блин, таймауте вообще речь?
Есть свойство SqlCommand.CommandTimeout (время ожидания выполнения команды (в секундах), по умолчанию используется значение 30 секунд), что относится к Вашему пункту 5: выполнить процедуру.
При чём тут SqlConnection?
...
Рейтинг: 0 / 0
14.01.2013, 18:12
    #38109775
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuhв п.5. если таймаут будет маленький обломается
Но если он будет большой в п. 3, то придется торчать весь таймаут в некоторых случаяхВсё-таки Вы путаете CommandTimeout и ConnectionTimeout
...
Рейтинг: 0 / 0
14.01.2013, 18:14
    #38109780
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
странная конструкция конечно получается

я бы сделал по другому:
у вас N коннекшнстрингов
поднимаете N таксов и берете первый же отработавший
а в таксе соответственно попытка открыть соедиение
закрытие всех остальных отработавших соединение должно идти после того, как получите актуальное


Если N - большое число, можно оптимизировать алгоритм случайной выборкой M (M подмножество N) строк из списка
...
Рейтинг: 0 / 0
14.01.2013, 18:20
    #38109788
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
skyANAWinnipuhв п.5. если таймаут будет маленький обломается
Но если он будет большой в п. 3, то придется торчать весь таймаут в некоторых случаяхВсё-таки Вы путаете CommandTimeout и ConnectionTimeout

закрутился... извините....
...
Рейтинг: 0 / 0
14.01.2013, 18:23
    #38109800
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
beg-in-erWinnipuh5. выполнить процедуру (она может выполняться 10 -60 сек )что ж за мешки вы ворочаете?

выборки из базы, бывает и дольше...
Для больших баз нормально.
...
Рейтинг: 0 / 0
14.01.2013, 18:38
    #38109825
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Arm79поднимаете N таксов и берете первый же отработавший
а в таксе соответственно попытка открыть соедиение
Я бы тоже так сделал
...
Рейтинг: 0 / 0
14.01.2013, 19:34
    #38109897
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Arm79странная конструкция конечно получается

я бы сделал по другому:
у вас N коннекшнстрингов
поднимаете N таксов и берете первый же отработавший
а в таксе соответственно попытка открыть соедиение
закрытие всех остальных отработавших соединение должно идти после того, как получите актуальное


Если N - большое число, можно оптимизировать алгоритм случайной выборкой M (M подмножество N) строк из списка

алгоритм не странный, там все сложнее, чем я описал.

В реале: я выбираю случайный индекс из массива случайным образом, т.е. мне надо распределять нагрузку.
...
Рейтинг: 0 / 0
14.01.2013, 20:21
    #38109947
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
WinnipuhВ реале: я выбираю случайный индекс из массива случайным образом, т.е. мне надо распределять нагрузку.
И как случайный индекс помогает равномерно ее распределить?
...
Рейтинг: 0 / 0
14.01.2013, 22:06
    #38110030
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh,

вы явно что-то путаете, но что именно - пока не понял

для того, чтобы получить открытое соединение, 30 секунд - это жуть как много. Все, что больше - это либо физически связь с сервером отвратна до ужаса, либо он очень сильно занят. Поэтому я считаю, что заморачиваться со случайным индексом строки соединения не нужно; отсортируйте ваш список в порядке предпочтительности и берите первый же отработавший коннект

Далее, непонятно, какого рода у вас процедуры. Если у вас OLTP - то процедура, отрабатывающая свыше 30 секунд и, что очень важно, за это время не выдавшая клиенту ни одной строчки резалтсета - это хардкор. Если же она возвращает миллионы записей, то таймаут совершенно не при чем, по таймауту процедура не срубится.
...
Рейтинг: 0 / 0
14.01.2013, 23:57
    #38110125
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Arm79Winnipuh,

вы явно что-то путаете...skyANACommandTimeout и ConnectionTimeout
...
Рейтинг: 0 / 0
17.01.2013, 16:37
    #38114256
Kasper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuh,

Вам, как я понял, нужна простая проверка доступности сервера из выбранной строки коннекта. Её и реализуйте, а затем откроете коннекцию.
...
Рейтинг: 0 / 0
17.01.2013, 17:07
    #38114306
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Я правильно понял, имеются N одинаковых БД (копии). и используются только на чтение?

Так может посмотреть в сторону NLB какого-нибудь? Они и "здоровье" серверов отслеживают и имеют разные алгоритмы распределения нагрузки (если у вас простой сценарий - read only и копии баз), также имеют возможность балансировки PerSession и PerRequest. Вам я так понимаю подойдет PerSession.
...
Рейтинг: 0 / 0
17.01.2013, 17:37
    #38114360
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Winnipuhbeg-in-erпропущено...
что ж за мешки вы ворочаете?

выборки из базы, бывает и дольше...
Для больших баз нормально.

А как клиентское ПО, ждет и ждет все время? А когда все инстансы под завязку, ждут еще больше? Если у вас очень много пользователей и вы уверены что заоптимизировали все уже по самые не могу. Можно рассмотреть что-то такое в первом приближении:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
                            БД ответов ----------------Ответы----------------------------->Клиенты
                                  ^
                                  |
                             Ответы
                                  |
(N копий БД) <------(Служба координатор)<----задачи---(Очередь)<---задачи---Клиенты
                                 



Координатор на основе некоторых метрик следит за загрузкой серверов и не позволяет перегружать их больше чем надо, очередь сглаживает всплески активности пользователей или случаи выхода серверов из строя. На координатор можно много повесить чего. Не зная вашу специфику трудно предлагать что-то.
...
Рейтинг: 0 / 0
17.01.2013, 17:40
    #38114363
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка доступности SqlConnection
Вместо БД ответов может быть очередь из которой другая служба берет сообщения и занимается рассылкой на почту отчетов тем кто их заказал.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проверка доступности SqlConnection / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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