Статус соединения к базе данных
От: andrewr  
Дата: 23.09.09 11:36
Оценка:
Правлю достаточно старый проект, где очень много строчек типа:

SqlConnection conn = new SqlConnection(connectionString);


И вот через какое то время понадобилось отображать иконку статуса при любом обращении к базе данных. Грубо говоря надо как то реагировать на обращение апликухи к БД. Что можно предпринять по этому поводу?
Re: Статус соединения к базе данных
От: Aen Sidhe Россия Просто блог
Дата: 23.09.09 11:41
Оценка:
Здравствуйте, andrewr, Вы писали:

A>Правлю достаточно старый проект, где очень много строчек типа:


A>
A>SqlConnection conn = new SqlConnection(connectionString);
A>


A>И вот через какое то время понадобилось отображать иконку статуса при любом обращении к базе данных. Грубо говоря надо как то реагировать на обращение апликухи к БД. Что можно предпринять по этому поводу?


Головой подумать. Непонятно, что надо.

Точно понятно, что вы не понимаете, как работает класс SqlConnection.
С уважением, Анатолий Попов.
ICQ: 995-908
Re[2]: Статус соединения к базе данных
От: andrewr  
Дата: 23.09.09 11:48
Оценка:
AS>Головой подумать. Непонятно, что надо.

Возможно плохо сформулировал вопрос. Попробую немного по другому. Мне нужно что-то наподобие хука, который ловит любую попытку открыть приложением соединения с базой данных, а так же момент закрытия соединения. Один из вариантов, которые нашел — это проверять NumberOfActiveConnections (http://msdn.microsoft.com/en-us/library/ms254503.aspx), но никак не выходит активировать этот идентификатор.

AS>Точно понятно, что вы не понимаете, как работает класс SqlConnection.


А по каким критериям сделан этот вывод???
Re[3]: Статус соединения к базе данных
От: HowardLovekraft  
Дата: 23.09.09 17:04
Оценка: +1
Здравствуйте, andrewr, Вы писали:

A>а так же момент закрытия соединения.

Смотря что понимать под моментом закрытия соединения. Если вызов Close, то в этот момент соединение просто отдается обратно в пул, и не факт, что сразу же будет закрыто.

А вообще, какой смысл в этом отслеживании статуса?
Надеюсь, ваше приложение не держит соединение длительное время?
Re[4]: Статус соединения к базе данных
От: andrewr  
Дата: 23.09.09 17:58
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, andrewr, Вы писали:


A>>а так же момент закрытия соединения.

HL>Смотря что понимать под моментом закрытия соединения. Если вызов Close, то в этот момент соединение просто отдается обратно в пул, и не факт, что сразу же будет закрыто.

HL>А вообще, какой смысл в этом отслеживании статуса?

HL>Надеюсь, ваше приложение не держит соединение длительное время?

Нет, конечно. Суть в том, что бы просто отображать статус иконку всегда, когда приложение лезет в базу данных. Т.е. неважно — закрывается ли соединение, то ли отдается в пул, но с логической точки зрения оно считается закрытым. По сути надо отслеживать момент вызова команд Open и Close/Dispose. Если бы это был один класс, то было бы проще, ессно, но реально каждое соединение все таки зашивается в using.

По сути я сейчас додумался до решения проблемы. Заменить new SqlConnection() на вызов статической функции, типа CreateConnection, где я просто добавлю хэндлер на StatusChange. Ессно, придется пройтись по всему коду для того, что бы заменить первое на второе, но поиск мифического хука соизмерим по времени с тупой заменой.
Re[5]: Статус соединения к базе данных
От: Sinix  
Дата: 24.09.09 07:42
Оценка:
Здравствуйте, andrewr

Извратов нам мало (код пишется на месте, могут быть опечатки):

public class DisposableWrapper<TDisposable> where TDisposable: IDisposable
{
  private readonly TDisposable disposable;
  private readonly Action disposedCallback;

  public DisposableWrapper(TDisposable disposable, Action disposedCallback)
  {
    Code.NotNull(disposable, "disposable");
    Code.NotNull(disposedCallback, "disposedCallback");   

    this.disposable=disposable;
    this.disposedCallback=disposedCallback;
  }

  public TDisposable WrappedDisposable
  {
    get
    {
      return disposable;
    }
  }

  public void Dispose()
  {
    disposable.Dispose();
    disposedCallback();
  }
}


Использование:
// ...
using (new DisposableWrapper(Connection,DoSomeClosedLogic))
{
  // ...
}
// ...


Ничего не мешает заменить disposable на делегат и использовать кастомную логику:

// ...
using (new DisposableWrapper(Connection.Close,()=>bla-bla-bla))
{
  // ...
}

// или
using (new DisposableWrapper(()=>
  {
    Connection.Close();
    DoSomeClosedLogic();
  }))
{
  // ...
}
// ...
Re: Статус соединения к базе данных
От: Slider_spb Россия  
Дата: 24.09.09 10:23
Оценка:
Здравствуйте, andrewr, Вы писали:

A>Правлю достаточно старый проект, где очень много строчек типа:


A>
A>SqlConnection conn = new SqlConnection(connectionString);
A>


A>И вот через какое то время понадобилось отображать иконку статуса при любом обращении к базе данных. Грубо говоря надо как то реагировать на обращение апликухи к БД. Что можно предпринять по этому поводу?


Первое что приходит в голову — сделать свой класс, наследуемый от SQLConnection и сделать "обёртку" вокруг нужных методов, перегрузив их...
Re[2]: Статус соединения к базе данных
От: andrewr  
Дата: 25.09.09 15:26
Оценка:
Здравствуйте, Slider_spb, Вы писали:

S_>Здравствуйте, andrewr, Вы писали:


A>>Правлю достаточно старый проект, где очень много строчек типа:


A>>
A>>SqlConnection conn = new SqlConnection(connectionString);
A>>


A>>И вот через какое то время понадобилось отображать иконку статуса при любом обращении к базе данных. Грубо говоря надо как то реагировать на обращение апликухи к БД. Что можно предпринять по этому поводу?


S_>Первое что приходит в голову — сделать свой класс, наследуемый от SQLConnection и сделать "обёртку" вокруг нужных методов, перегрузив их...


Это да, но класс SqlConnection sealed. Потому лучше таки сделать статическую функцию, где мы подготавливаем сам класс и добавляем там же хэндлер на ChangeState.

Чесслово — пока не запостил на форуме вопрос — не додумался
Re[5]: Статус соединения к базе данных
От: Sinclair Россия https://github.com/evilguest/
Дата: 30.09.09 11:11
Оценка:
Здравствуйте, andrewr, Вы писали:

A>По сути я сейчас додумался до решения проблемы. Заменить new SqlConnection() на вызов статической функции, типа CreateConnection, где я просто добавлю хэндлер на StatusChange. Ессно, придется пройтись по всему коду для того, что бы заменить первое на второе, но поиск мифического хука соизмерим по времени с тупой заменой.

Самое главное — не забыть при закрытии соединения отписать хэндлер от StatusChange. Иначе есть риск утечки памяти.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.