Почему ODBCConnection.State надежный? - PullRequest
1 голос
/ 09 августа 2010

Рассмотрим простую настройку:

// _conn is the OdbcConnection with a MySQL-Server (MySQL-Connector 3.51)
// _cmd is a created OdbcCommand

// Constructor has created the objects successfully

public void DoSomething() {
    if(_conn.State == ConnectionState.Open)
        _cmd.ExecuteNonQuery();
}

Теперь моя проблема в том, что OdbcConnection.State не надежен.Дело в том, что через некоторое время соединение теряется, но State -Property ничего об этом не знает и постоянно говорит мне, что соединение открыто, по крайней мере, до того момента, когда я пытаюсь выполнить команду (что не удаетсяизящно).У меня даже была ситуация, когда State -Property никогда не обновлялся, и продолжал говорить мне, что соединение все еще существует (но команды не выполнялись).

Конечно, я мог бы добавить блоки Try {...} Catch {...} в свой кодно я пытался избежать их, потому что расширение двухстрочной функции с минимум четырьмя строками обработки ошибок немного ... тяжело.

Так что мой вопрос: почему OdbcConnection.State не является надежным ия могу это исправить?

1 Ответ

4 голосов
/ 09 августа 2010

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

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

Кроме того, существует тот факт, что между вызовом State == Open и фактическим выполнением команды существует условие состязания: вы можете вызвать State == Open, а затем кто-то потянет за вилку перед выполнением команды.

Итак, в конце концов, вам все равно придется иметь этот обработчик исключений. Я также хотел бы предложить, чтобы вы не помещали исключение вокруг каждого отдельного вызова в базу данных. Если вы работаете с веб-сайтом, то используйте обработчик на уровне страниц и оставьте все как есть. В действительности нет никакого смысла пытаться «обработать» базу данных, выходящую из строя каким-либо иным способом, кроме отображения сообщения об ошибке пользователю в любом случае ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...