Как проверить, открыто ли соединение с базой данных в Ado.Net? - PullRequest
0 голосов
/ 10 марта 2010

Есть ли способ проверить, открыто ли соединение с базой данных? Я пытаюсь проверить connectionState, но он показывает ConnectionState как открытый, даже когда база данных не работает.

private bool IsValidConnection(IDbConnection connection)
        {
            return (connection != null && connection.State == ConnectionState.Open);
        } 

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Хотя у меня нет ответа, я могу сказать вам, почему такие вещи случаются Это в основном происходит с любым протоколом выше TCP, который не отправляет периодические импульсы.

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

В идеальном случае сервер отправляет пакет TCP FIN, когда он выходит из строя, но этого не происходит, если кто-то выдергивает сетевой кабель, сервер сильно падает или промежуточный межсетевой экран / межсетевой экран NAT молча прерывает соединение. Это приводит к тому, что клиент не знает, что сервер ушел, и вам придется что-то отправить и предположить, что сервер ушел, вы не получили ответ в течение разумного времени или произошла ошибка (как правило, первые несколько отправляют () вызов после тихого отключения сервера не выдаст ошибку).

Итак, если вы хотите убедиться, что соединение с БД в порядке, выполните запрос select 1; `. Некоторые низкоуровневые API БД могут иметь метод ping () / isAlive () или similer, который можно использовать для той же цели.

0 голосов
/ 19 июня 2010

простым способом было бы закодировать кнопку с запросом, извлечь некоторые данные из некоторой таблицы базы данных, если возвращается ошибка, поймать ее.

, который будет показывать, если соединение есть или нет.

0 голосов
/ 10 марта 2010

Это похоже на правильный код, чтобы проверить, открыто ли ваше соединение с БД.

Я ожидаю увидеть исключение в вашем соединении. Open (), когда база данных не работает. База данных не работает до того, как вы открываете соединение, или она отключается после открытия?

...