91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
MySQL

Как правильно делать RECONNECT в JDBC ?

15.12.2014, 12:10. Показов 4879. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Скажу сразу, у меня всё коннектится и всё работает проблема в переподключением к бд.

Обращался к гуглу и здесь на форуме конечно искал, но разумного решения не нашел.
Иностранцы ищут проблемы в прокси\антивирусах и т.п...
У меня бд на локалхосте.
В MySQL параметр wait_timeout=60 (секунд), тоесть сервер бд автоматом разорвет коннект с клиентом если нет никаких движений.
Сразу скажу, что проблему хочу решить со стороны клиента и этот параметр менять нет смысла, более того это бд для web'а.

Первое что рекомендуют - увеличить wait_timeout, ответил выше.

Второе - дописать в строку ?autoReconnect=TRUE, этот вариант можно сказать работает у меня частично, а именно переподключается после ексепшина, распишу подробнее
1) подключаюсь к бд -> удачно
2) отправляю sql инструкцию insert -> удачно
3) жду 2 минуты
4) отправляю инструкцию из пункта 2 -> exception (тут происходит autoReconnect), но данные уже потеряны
5) пробую повторить пункт 4 сразу -> удачно

Третий вариант - пробовал перед обращением к бд (executeUpdate) смотреть на isClosed, но он тоже меняется на FALSE после ексепшена, так то я и без него узнаю.

Всё таки как проверить актуально ли соединение с бд до обращения к ней и не ловить ексепшены?
Ведь и восстанавливать связь после ексепшена не есть хорошо? Имею в виду, что исключения не должны влиять на логику работы приложения.

Заранее благодарен всем откликнувшимся.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2014, 12:10
Ответы с готовыми решениями:

Как правильно применять Java Servlets и JDBC?
У меня есть программа которая терзает базу данных берёт оттуда данные и помещает их в html отчёт (моя программа т.е можно всё там менять) и...

Как правильно установить JDBC драйвер для работы с Tomcat?
Я долго мучался, пытаясь понять, почему при обращении к БД возникает СlassNotFoundException: org.gjt.mysql.Driver (CLASSPATH на драйвер...

Соединение с MS Access или что делать с ошибкой sun.jdbc.odbc.JdbcOdbcDriver
Начал работать в Java не давно, и вот нужно освоить БД(используя MS Access). Ничего путнего кроме как видео на YouTube, где парень...

3
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.12.2014, 13:42
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
Всё таки как проверить актуально ли соединение с бд до обращения к ней и не ловить ексепшены?
Выполнить какой-нибудь запрос. SELECT 1 например.
1
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
15.12.2014, 14:30  [ТС]
Но ведь тогда будет ексепшен.
А вопрос как не ловить ексепшен.

Добавлено через 14 минут
В общем смотрю в сторону метода isValid(int).
Кто нибудь использовал его и какие впечатления?

Вот так решает мою проблему, но правильно ли?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
try {
...
        c = DriverManager.getConnection(url, user, password);//Установка соединения с БД
        st = c.createStatement();       
    } catch (SQLException ex) {
        System.out.println("[Error] SQLException установка соединения");
    }
...
//getIsValid получает текущий статус о соединении (как я понял)
public boolean getIsValid(){//это на самом деле не нужная обертка над методом isValid, можно без него
    try {
   if (c.isValid(1)){
       //System.out.println("- - - - - VALID Соедининие ОТКРЫТО - - - - -");
       return true;
   }
   else{
       //System.out.println("- - - - - VALID Соедининие ЗАКРЫТО - - - - -");
       return false;
   } 
   } catch (SQLException ex) {
        System.out.println("[Error] getIsValid()");
      }
    return false;
}
//ТОТ САМЫЙ МЕТОД RECONNECT ВЫЗЫВАЕМЫЙ НИЖЕ
public void connectToBD(){
    try {
        c.close();//ПРАВИЛЬНО ЛИ ТАК ДЕЛАТЬ???
        c = DriverManager.getConnection(url, user, password);//Установка соединения с БД
        st = c.createStatement();
    } catch (SQLException ex) {
    System.out.println("[Error] connectToBD()");   
    }
}
 
public void writeBD(String s, int command){
        if (getIsValid()){//Если все хорошо
            sendDB(s,command);
        }else{//если нет коннекта
            System.out.println("Переподключение к БД.");
            connectToBD();//ТУТ ВЫЗОВ RECONNECT
            sendDB(s,command);//Это обращение уже к самой базе
        }
}
...//далее не интересно
Можно ли так делать в connectToBD?
Тоесть сначало закрываю и снова открываю.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
15.12.2014, 15:14
Лучший ответ Сообщение было отмечено _Night_Scream_ как решение

Решение

Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
Но ведь тогда будет ексепшен.
Какая разница: вызывать isValid или ловить exception? Всё равно ведь придется писать обработку случая, когда connection разорвался.
К слову, чаще всего connection-пулы используют именно select, вместо простого isValid. isValid может быть реализован криво и по разному в разных JDBC-драйверах.
Цитата Сообщение от _Night_Scream_ Посмотреть сообщение
Можно ли так делать в connectToBD?
да, правильно. Только я бы сделал отдельный try-catch для c.close() - потому что даже если там вылетит exception, врят ли пользователю нужно о нем знать. Connection ведь всё равно новый создастся.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2014, 15:14
Помогаю со студенческими работами здесь

Как правильно делать обновление таблицы?
Есть таблица на Frame1, данные берутся из БД. Есть кнопка на Frame2, при нажатии которой в БД добавляется строчка. Но в таюлице эта...

Как правильно делать сайт?
Довольно много прочитал всякой ерунды в инете, посмотрел парочку видеокурсов... Везде одно и то же - сайт должен быть правильно сделан,...

Как правильно делать подзапросы?
Люди как их делать... ПР: If request.querystring('a1')='a2' Then SQL.execute(Select * From table) ...<td>rs('Чето')</td>......

Как правильно делать ссылку?
Всем доброго времени суток! Делаю сайт, учусь... Пишу ссылки на страницах, например, такой адрес в href"": ./alc/vodka/. На...

Как правильно делать копипаст
Всем привет!!! Веду компьютерный блог. Очень редко делаю 100% копипаст например дайджестов компьютерных вирусов, естественно с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru