Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > JDBC - наличие подключения к БД


Автор: coderinside 5.1.2007, 00:35
Доброе время суток! Подскажите как определить потерю связи с сервером БД? В кратце: сервер - postgres, клиентская GUI программа на swing'e. Ест-но БД на другом компьютере в сети. Возможны частые отключения кабеля smile Т.е. нужно чтобы при выполнении очередного запроса программа корректно определила потерю соединения и сообщила пользователю что связь с сервером потеряна, попробуйте подключиться позже нажав на такую-то кнопку. Подскажите куда смотреть? Как вообще лучше писать подобный код? Может желательно все запросы выполнять как-то централизованно или это без разницы? Но самое главное сейчас - это как же все таки определить что связи нет?
Сейчас делаю так:
Код

    public String[] getAreas(String region)
    {
        Vector<String> areas = new Vector<String>(10);
        try
        {
            ResultSet dbResult;
            dbResult = XCore.dbStat.executeQuery("select area.title " +
                    "from area,region,country where " +
                    "area.region_id=region.region_id and " +
                    "region.country_id=country.country_id and " +
                    "region.title='"+region+"' ORDER BY TITLE");
            
            while (dbResult.next())
            {
                areas.add(dbResult.getString("TITLE"));
            }
        }
        
        catch (SQLException ex)
        {
                    System.out.println("--- SQLException caught ---");
                    while (ex != null)
                   {
                     System.out.println("Message: " + ex.getMessage());
                     System.out.println("SQLState: " + ex.getSQLState());
                     System.out.println("ErrorCode: " + ex.getErrorCode());
                     ex = ex.getNextException();
                     System.out.println("");
                   }

        }
        
        String[] res = (String[])areas.toArray(new String[1]);
        return res;
    }


Естественно если кабель выдернуть то будут exception'ы. Как следует это делать?

Автор: COVD 5.1.2007, 00:47
Соединение нарушено, база зависла, в нее попал вражеский снаряд или она очень занята, в любом случае попытка общения с ней закончится исключением. А дальше можно попытаться создать новое соединение.

Автор: coderinside 5.1.2007, 01:55
Цитата(COVD @ 5.1.2007,  00:47)
Соединение нарушено, база зависла, в нее попал вражеский снаряд или она очень занята, в любом случае попытка общения с ней закончится исключением. А дальше можно попытаться создать новое соединение.

Т.е. намек на то, что обработку исключений от всех возможных запросов нужно проводить где-то в одном месте, там попытаться разузнать какое исключение означает обрыв соединения (и пр.) и по нему ставить флаг - "НЕТ ПОДКЛЮЧНИЯ"? Так?

Автор: tux 5.1.2007, 06:48
Цитата(coderinside @  5.1.2007,  01:55 Найти цитируемый пост)
Т.е. намек на то, что обработку исключений от всех возможных запросов нужно проводить где-то в одном месте, там попытаться разузнать какое исключение означает обрыв соединения (и пр.) и по нему ставить флаг - "НЕТ ПОДКЛЮЧНИЯ"? Так? 

Именно так. Тебе остается надеяться только на тот сервис, который предоставляет драйвер JDBC. Насколько я помню драйвер от PostgreSQL выдает вполне вменяемое исключение в случае потери связи с сервером. Есть еще один вариант - выполнять постоянный пинг сервера и запускать запросы только в том случае если пинги проходят. Но это не защитит от обрыва соединения во время выполнения запроса. Еще учти, что связаться с сервером драйвер пытается довольно длительное время и желательно предусматривать это в программе чтобы пользователь за время ожидания не наделал ничего лишнего.

Автор: COVD 5.1.2007, 16:18
Цитата

Т.е. намек на то, что 


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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)