Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JDBC - наличие подключения к БД, Как определить обрыв подключения 
:(
    Опции темы
coderinside
  Дата 5.1.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



Доброе время суток! Подскажите как определить потерю связи с сервером БД? В кратце: сервер - 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'ы. Как следует это делать?
PM MAIL WWW ICQ   Вверх
COVD
Дата 5.1.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Соединение нарушено, база зависла, в нее попал вражеский снаряд или она очень занята, в любом случае попытка общения с ней закончится исключением. А дальше можно попытаться создать новое соединение.
PM MAIL   Вверх
coderinside
Дата 5.1.2007, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 2.8.2006

Репутация: нет
Всего: нет



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

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


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



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

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

Это сообщение отредактировал(а) tux - 5.1.2007, 07:38
PM MAIL Skype GTalk Jabber YIM   Вверх
COVD
Дата 5.1.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 17
Всего: 43



Цитата

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


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


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0744 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.