Какой-нибудь хитрый и быстрый способ проверить соединение с Oracle - PullRequest
1 голос
/ 15 февраля 2012

Моя служба WCF должна проверить, доступно ли сейчас соединение и можем ли мы с ним работать. У нас много удаленных БД. Их связь иногда странная и не может быть использована для запроса данных или чего-то еще. Так, например, это обычная строка подключения:

User Id=user;Password=P@ssw0rd;Data Source=NVDB1;Connection Timeout=30

Вот метод обслуживания, используемый для получения

    public List<string> GetAliveDBs(string city)
    {
        if (String.IsNullOrEmpty(city))
            return null;                        

        List<string> cityDbs = (from l in alldbs where !String.IsNullOrEmpty(l.Value.city) && l.Value.city.ToUpper() == city.ToUpper() select l.Value.connString).ToList();            

        // There is no such city databases
        if (cityDbs.Count == 0)
            return null;

        ReaderWriterLockSlim locker = new ReaderWriterLockSlim();

        Parallel.ForEach(cityDbs, p =>
        {
            if (!IsConnectionActive(p.connString))
            {
                locker.EnterWriteLock();
                try
                {
                    cityDbs.RemoveAt(cityDbs.IndexOf(p));
                }
                finally
                {
                    locker.ExitWriteLock();
                }
            }
        });

        return cityDbs;
    }

    static public bool IsConnectionAlive(string connectionString)
    {
        using (OracleConnection c = new OracleConnection(connectionString))
        {
            try
            {                    
                c.Open();
                if ((c.State == ConnectionState.Open) && (c.Ping()))
                    return true;
                else
                    return false;
            }
            catch (Exception exc)
            {
                return false;                 
            }
        }
    }

Я использую компоненты devart для связи с БД Oracle. Надеюсь на вашу помощь, ребята! Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

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

SELECT 1

(этот оператор работает на MS SQL и MySQL ...должен работать и на Oracle, но я не могу этого подтвердить).

Если вы получите ожидаемый результат (в данном случае одна строка с одним столбцом, содержащим «1»), то соединение допустимо.

Как минимум один менеджер пулов соединений использует эту стратегию для периодической проверки соединений.

ОБНОВЛЕНИЕ:

Вот версия вашего метода для SQL Server.Вы, вероятно, можете просто заменить «Sql» на «Oracle».

static public bool IsConnectionAlive(string connectionString)
{
    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand("SELECT 1", conn))
            {
                int result = (int)cmd.ExecuteScalar();
                return (result == 1);
            }

        }
    }
    catch (Exception ex)
    {
        // You need to decide what to do here... e.g. does a malformed connection string mean the "connection isn't alive"?
        // Maybe return false, maybe log the error and re-throw the exception?
        throw;
    }
}
1 голос
/ 15 февраля 2012

Если цель состоит в том, чтобы просто определить, живет ли сервер по IP-адресу или имени хоста, то я бы порекомендовал Ping (нет трехстороннего рукопожатия и имеет меньше служебных данных, чем UDP-сообщение).Для этого вы можете использовать класс System.Net.NetworkInformation.Ping (см., Например, документацию ).

Если вы хотите доказать, что на самом деле что-то прослушивает общий порт Oracle,Я бы предложил использовать класс System.Net.Sockets.TcpClient или System.Net.Sockets.Socket (их документация также содержит примеры) для обеспечения этого.

Самый простой способ сделать это (безусловно) просто открыть соединение, используя Oracle API для C #.Существует очень хороший учебник, который включает код здесь .Он охватывает не только соединение, но вы должны иметь возможность отделить соединительную часть от остальной части в соответствии со своими потребностями.

0 голосов
/ 15 февраля 2012

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

...