Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate и восстановление после сбоя сети / 14 сообщений из 14, страница 1 из 1
04.02.2015, 15:32
    #38871512
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Добрый день!

Есть hibernate. Есть сеть.

Создаю фактори как
Код: sql
1.
2.
3.
            Configuration configuration = new Configuration();
...
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);



Иногда связь с сервером БД падает. Надо, соответственно, пересоздать sessionFactory.
Вопрос - как?
Я сделал обёртку,
Код: sql
1.
2.
3.
4.
5.
6.
public class ClosableSession implements AutoCloseable {
    private final Session session;
    public ClosableSession(SessionFactory sessionFactory) {
        session = sessionFactory.openSession();
...
}



По идее получается, что надо каждое обращение к БД обернуть в
Код: sql
1.
2.
3.
4.
5.
6.
        try (ClosableSession closableSession = sessionProvider.get()) {
            ...
        } catch (JDBCConnectionException e) {
            sessionProvider.invalidate(); // Тут sessionFactory=null
            throw e;
        }



Но как-то это выглядит тоскливо.
Можно ли при закрытии сессии (session.close()) узнать, в каком она состоянии, и если было возбуждено JDBCConnectionException сбрасывать фактори?
Как это делается?

PS: а если голый JDBC? А если коннект к MongoDB? Как это делать красиво?

--
Алексей.
...
Рейтинг: 0 / 0
04.02.2015, 15:50
    #38871537
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Alexey Tomin,
пробовал ничего не делать?
При падении сети?
По умолчанию кэш второй не включен. А сессия открыта только на момент запроса.
...
Рейтинг: 0 / 0
04.02.2015, 16:04
    #38871552
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Petro123пробовал ничего не делать?

Конечно пробовал. Бывало сутки висело (на выходные коннект отпадал).

Любая попытка работы приводит к тому, что sessionFactory.openSession() отрабатывает, но попытка использовать эту сессию приводит к ошибке
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
org.hibernate.exception.JDBCConnectionException: could not extract ResultSet
	at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
...
	at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402)
...
        Тут мой код
Caused by: java.sql.SQLRecoverableException: Данные для считывания из сокета отсутствуют
	at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)
	... 30 more
...
Рейтинг: 0 / 0
04.02.2015, 16:48
    #38871607
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Alexey TominБывало сутки висело (на выходные коннект отпадал).
я не очень понял, что именно висело.
Если у вас длинные транзакции и коннект постоянный, то autoReconnect=true
Если у вас короткие, на момент rest запроса, то проверьте всё ли закрывается после запроса....отдаётся ли в пул коннект и т.д.
IMHO
...
Рейтинг: 0 / 0
04.02.2015, 16:55
    #38871613
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Alexey TominИногда связь с сервером БД падает. Надо, соответственно, пересоздать sessionFactory.

Это заблуждение. Используйте DataSource с валидацией и пересозданием соединений. ORM отношения к соединению с базой не имеет. SessionFactory пересоздавать не нужно.
...
Рейтинг: 0 / 0
04.02.2015, 16:57
    #38871616
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Petro123Если у вас короткие, на момент rest запроса, то проверьте всё ли закрывается после запроса....отдаётся ли в пул коннект и т.д.
IMHO

Короткие.
Всегда коннект закрываю через session.close() - но это ж пулл, реально коннекты висят.

Пробую автопереоткрытие сделать. К меня настройки в properties-файле
Код: sql
1.
2.
3.
4.
5.
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.pool_size=10
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.connection.autocommit=false
hibernate.current_session_context_class=thread


...
Добавляю
Код: sql
1.
2.
3.
hibernate.connection.autoReconnect=true
connection.autoReconnect=true
hibernate.autoReconnect=true


Не помогает
c3p не использую.
...
Рейтинг: 0 / 0
05.02.2015, 09:07
    #38871904
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Надо взять нормальный пул с нормальными настройками. У меня highload нет, поэтому Apache DBCP устраивает по всем параметрам. Рекомендую.
...
Рейтинг: 0 / 0
05.02.2015, 09:10
    #38871907
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Пока такое решение нарисовалось:

Добавил класс SessionProvider.
Вся работа с БД - через методы вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public <V> V execute(GetAction<V> action) {
        Session session = getOrCreateSessionFactory().openSession();
        try {
            session.beginTransaction();
            return action.call(session);
        } catch (JDBCConnectionException e) {
            sessionFactory = null;
            throw e;
        } finally {
            session.close();
        }
    }



Соответственно в этих методах всё- и удаление фактори при ошибке, и можно встроить проверку валидности через "select 1 from dual" какой-нибудь.
...
Рейтинг: 0 / 0
05.02.2015, 10:18
    #38871958
пролетевший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
BlazkowiczЭто заблуждение. Используйте DataSource с валидацией и пересозданием соединений. ORM отношения к соединению с базой не имеет. SessionFactory пересоздавать не нужно.
+100 . Делали приложение, что то вроде ETL - в несколько потоков перелопачивает кучу данных. Использовался пул bonecp, и Guice JPA ( со Spring или ручным созданием сессии все точно так же ). Метод где происходит создание/завершение сессии и транзакция оборачивался интерцептором который в случае восстановимых ошибок ( по типу и содержимому Exception ) ждал некоторое время и повторял вызов метода. С ограничениями на максимальное время повторов и увеличивающимися интервалами.
Очень эффектно : выдрать сетевой кабель - приложение начинает поругиваться. После возвращения кабеля на место работает как ни в чем ни бывало.
Естественно, код надо писать так чтобы его можно было вызывать многократно.
...
Рейтинг: 0 / 0
05.02.2015, 12:42
    #38872157
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Alexey TominПока такое решение нарисовалось:
Хрень типа спринговых *Template классов, который Кинг всё время хаял.
...
Рейтинг: 0 / 0
05.02.2015, 13:18
    #38872232
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
BlazkowiczНадо взять нормальный пул с нормальными настройками. У меня highload нет, поэтому Apache DBCP устраивает по всем параметрам. Рекомендую.

А где у него кнопка? Т.е. как его настроить на самовосстановление?
И как его подсунуть под hibernate?
...
Рейтинг: 0 / 0
05.02.2015, 14:00
    #38872290
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Alexey Tomin,

http://commons.apache.org/proper/commons-dbcp/configuration.html
testOnBorrow и все что рядом.

У вас хибер на томкате или на чем живет? В контейнере лучше настраивать DataSource на уровне контейнера и использовать его через JNDI.

Если контейнера нет, то в гугле масса рецептов по прямой интеграции:
http://www.mkyong.com/hibernate/how-to-configure-dbcp-connection-pool-in-hibernate/
...
Рейтинг: 0 / 0
05.02.2015, 14:01
    #38872293
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
Есть дажа проприетарные пулы типа Oracle-OCP. Они умеют слушать серверы и реагировать на падения
узлов в кластере и прочие события которые могут быть важны для подключений.
...
Рейтинг: 0 / 0
09.02.2015, 15:57
    #38874939
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
hibernate и восстановление после сбоя сети
BlazkowiczЕсли контейнера нет, то в гугле масса рецептов по прямой интеграции:
http://www.mkyong.com/hibernate/how-to-configure-dbcp-connection-pool-in-hibernate/

Да, дошли руки- сделал. Спасибо, dbcp2 хорошо лёг под hibernate и коннект восстановился. Код в примере, правда, устарел, ну да это мелочи.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate и восстановление после сбоя сети / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]