В C #, как лучше всего определить, работает ли база данных?

2

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

private static bool IsDatabaseConnectionUp(string connectionString)
{
    System.Data.SqlClient.SqlConnection conn = null;

    try
    {
        conn = new SqlConnection(connectionString);

        conn.Open();

        return conn.State == System.Data.ConnectionState.Open;
    }
    catch (SqlException)
    {
        // There was an error in opening the database so it is must not up.
        return false;
    }
    finally
    {
        if (conn != null)
        {
            if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }

            conn.Dispose();
        }
    }
}

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

Есть ли лучший способ?

  • 1
    Вы должны избавиться от вашей связи.
  • 0
    Ага. Похоже, вы оставляете соединение открытым.
Показать ещё 1 комментарий
Теги:
database
ado.net

6 ответов

2
Лучший ответ

Это действительно зависит от того, что вы пытаетесь определить. Если вы действительно хотите определить, работает ли "Сервер и доступен ли доступ", я бы сказал, что это наиболее вероятно самый эффективный способ. Причина, по которой я говорю, заключается в том, что сам сервер может быть включен, но он может не принимать соединения, или соединение, которое приложение использует, может быть недействительным (неправильное имя пользователя/пароль).

Поэтому, учитывая это, тайм-аут является необходимой вещью, так как вы хотите проверить истинное соединение. Если вы хотите просто посмотреть, есть ли сервер, вы можете попробовать выполнить ping, но это просто говорит вам, является ли устройство активным, а не обязательно, если SQL Server полностью запущен и доступен.

2

Поскольку вы специально смотрите на подключение SQLServer, введите строку подключения в объект SqlConnectionStringBuilder и измените значение таймаута.

SqlConnectionStringBuilder csb = 
   new SqlConnectionStringBuilder(connectionString);
csb.ConnectTimeout = 5;
string newConnectionString = csb.ToString();

Таким образом вы контролируете значение таймаута. Помните, не устанавливайте его слишком низко или вы получите ложные срабатывания.

1

Ваш шаблон близок, но есть одна проблема с ним. Поскольку SQLConnection реализует IDisposable, вы действительно должны избавиться от своего тестового соединения, прежде чем возвращать его.

try
    {
        using (System.Data.SqlClient.SqlConnection conn = new SqlConnection(connectionString))
        {

            conn.Open();

            return conn.State == System.Data.ConnectionState.Open;
        }
    }
    catch (SqlException)
    {
        // There was an error in opening the database so it is must not up.
        return false;
    }

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

0

Если вы беспокоитесь о тайм-ауте, есть несколько вещей, которые вы могли бы попробовать...

Вы можете попробовать выполнить ping-сервер. Если ICMP-пакеты не запрещены, это скажет вам быстрее, если ваш сервер не работает. Если вы не можете выполнить ping, вы не можете подключиться. Очевидно, это не гарантирует, что вы можете подключиться, но это ускорит процесс, когда вы не сможете.

Вы можете использовать другую строку соединения для теста подключения к серверу. Обычно вам не требуется полное время по умолчанию, чтобы установить соединение, поэтому вы могли бы существенно снизить его.

Если вы можете разрешить несколько устаревших данных, вы можете иметь службу, которая идет, и проверяет соединение каждые X минут (5 или 10 или что-то еще), а затем отправляйте запрос на эту самую последнюю информацию. Это больше похоже на то, как действует Witness.

0

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

0

Это может быть упрощенный фрагмент кода, но не должен ли вы иметь значение conn.Dispose() или using (...) {...}?

Edit: nevermind, я вижу комментарии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню