Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
MySQL

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

15.12.2014, 12:10. Показов 4874. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru