powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как на сервере получать сообщения от БД?
25 сообщений из 39, страница 1 из 2
Как на сервере получать сообщения от БД?
    #39179425
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток!

Собственно весь вопрос в теме.
Если чуть конкретнее - есть БД SQL Server и сервер GlasFish. В БД крутится триггер, который проверяет в одной из таблиц целостность данных при сохранении (кго алгоритм тут уж роли не играет). В случае неудачи транзакция откатывается.
И вот далее интересно:
Как донести инфу о том почему именно транзакция не свершилась клиенту?
1. Конкретно в MS SQL триггер может выдать методом PRINT сообщение, которое прочтет админ БД если ему сильно захочется поработать с базой напрямую - отпадает.
2. Я попользовался методом RAISEERROR, в которое упаковал сообщение - это оказалось ближе к истине. На сервере после flush этот exception и "лежащее" в нем сообщение ловятся, но довольно "некрасивым" способом. У меня (используется JPA) вышло так: „PersistenceException“ -> „DatabaseException“ -> „SQLServerException“ -> „Exception от триггера“ с сообщением через getLocalizedMessage().

Мне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей?

Заранее спасибо!

П.С.: то что проверять можно на клиенте перед сохранением понятно. Как раз и хотелось бы "из спортивного интереса" попробовать получить универсальное решение со стороны самой базы чтобы потом уже с увеличением количества триггеров (а оно в небольшой степени будет в любом случае) не думать ни о чем.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39179464
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
посмотри на использование udf.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39179732
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
все зависит от того в каком режиме это должно работать, если реакция нужна моментально и в этом же потоке, то наверное ваш вариант с выбрасыванием исключения вполне будет работать.
В других ситуациях можно по извращаться:
1. Писать в лог таблицу, которая регулярно просматривается демоном в вашем приложении и как то реагирует на появление новых записей.
2. В MS SQL есть штука под названием query notifications, которую можно подружить с JMS.
3. Наверное можно извернуться и отправить http запрос на какой-нибудь ваш сервлет.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39179857
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabМне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей?
этот способ самый простой и эффективный.
RAISE "У клиента .... отсутствуют средства на счёте" из триггера
Копай его.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39179858
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabсообщение ловятся, но довольно "некрасивым" способом
подробнее.
Сообщения нужно делить на уровни.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180806
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя, с udf не сталкивался - посмотрю. Спасибо.

just_vladimir да реакцию нужна сразу. Клиент сохраняет изменения, которые триггер откатывает как невалидные. Конечно ему надо сообщить в чем дело без отлагательств. JMS - очень хорошая мысль. До ее реализации на сервере у нас еще не дошло, хотя это определенно придется сделать. То что MS SQL с ней дружит для меня новость - классно. Не знаю возможно позже я попробую именно этот метод реализовать. Отправлять же дополнительный запрос - ну наверное это можно сделать рабочим методом но по моим ощущениям это потребует больше "костылей" чем мои потуги с вытягиванием сообщения из эксепшена... Спасибо!

Petro123 RAISE "У клиента .... отсутствуют средства на счёте" из триггера - ну пока как-то так это и работает в тестовом режиме. Сообщения нужно делить на уровни. - вы имеете ввиду уровень эксепшена в самой БД? Это в триггере конечно делается. Я про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе, да еще и приходится брать причину (getClause() если не ошибаюсь), причем ни один раз. Как-то это противит моему эстетическому чувству:)
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180838
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
есть 2 варианта:
- трёхзвенка + БЛ на аппСервере и там разбираемся с исключалками
- двухзвенка + БЛ в БД.
Логично что разбираются с исключалками возле БЛ.
Т.к. надо предпринимать действия при откате.

RuslanGabЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе
это к врачу....про принципы.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180855
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab Сообщения нужно делить на уровни. - вы имеете ввиду уровень эксепшена в самой БД?
не совсем.
Я говорил шире.
Если у вас JPA и декларативное управление транзакциями, то вам неизбежно нужно меньше проверять в триггерах и больше в напр. спринге
Код: java
1.
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)


Exception.class - обработает ваше исключение.
ЗЫ
Логирование и Сообщения от БД это не ошибки из триггера.
Уровни по слоям и уровни по типам ошибок это обратка от сервера БД к пользователю и техподдержке
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180858
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
совсем рядом близкая тема
spring operation log
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180926
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123RuslanGabЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе
это к врачу....про принципы.

Вспомнилось.
А. Сапковский– Старею, видать, – буркнул ведьмак немного погодя. – Принципы наружу вылезли.
– У стариков это бывает. – Мильва с сочувствием глянула на него. – И часто вылезают? Отвар из медуницы, говорят, помогает. И вправлять надо. А пока – клади себе подушечку под зад.
– Принципы, – серьёзно пояснил Лютик, – не геморройные шишки. Ты путаешь понятия.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180935
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе
с этим трудно спорить..
но в аксессе есть такой метод, широко используемый и очень облегчающий код
перед тем местом где возможно "исключение" назначается обработчик, и в нем делается , что нужно.
правда в аксе есть возможность вернуться в точку возникновения "исключения " и продолжить выполнение, как будто исключения не было.
очень помогает , когда требуется куча проверок для недопустимости исключения.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180982
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяправда в аксе есть возможность вернуться в точку возникновения "исключения " и продолжить выполнение, как будто исключения не было.
неужели goto?
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180989
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
все просто, сервер бд выдает стандартным средством ошибку с сообщением, по connectivity она летит клиенту СУБД, который есть твой Glassfish, далее в его воле делать с этим сообщением что угодно - в частности, послать сообщение своему клиенту.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39180991
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,
если не ошибаюсь
on error goto
Nebo может поправить
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181011
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
за goto в JPA тыщу баксов не платят)).
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181018
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123вадя,
за goto в JPA тыщу баксов не платят)).
если ты не владеешь темой - не лезь
on error goto и простой goto отличаются как небо и земля.
on error goto это равносильно try catсh в java, только с фишкой - возарата в точку возникновения этого исключения и продолжения работы с исправленными переменными., а не просто пропуск кода , как в java
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181025
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabМне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей?

Не совсем понятно что автор хочет? Что такое более нативное?
Не нравится формат стека исключений? Это фикситься своим пользовательким
исключением и его обработкой.

Может быть автор нам нарисует ИНТЕРФЕЙС своей мечты и пояснит как он
хотел-бы получать своё сообщение и в каком виде.

В противном случае получается что автор просто капризничает
и хочет птичьего молока...
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181026
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123, spring не используем - варианты с его аннотациями отпадают. Правильно ли я понимаю что так или иначе мне надо на уровне БЛ разбираться с исключениями, т.е. все же ничего адекватнее подъема исключения в самой БД (которое я перехватил на сервере) параллельно с откатом транзакции не имеется (даже если начать теоретически смотреть на Spring и AOP - все же они опять таки будут ловить это же самое исключение но пусть изящнее и проще)!? Тогда выходит что все то же и так же - я триггером откатываю транзакцию и поднимаю исключение - на сервере его ловлю (что мне кажется не оптимальным) и получаю пройдя через несколько "порождающих" исключений таки некое сообщение (или код - не суть), которое так или иначе уже шлю клиенту. Это до чего я сумел доскрипеть и что мне не понравилось (ну Ок - пусть мои сомнения живут и дальше в моей мятущейся и ищущей совершенства душе). Принципиально лучше ничего не существует? Нет библиотек которые могли бы нормально "обмениваться сообщениями" с базой и соответствующих методов "отправки сообщений" в самой БД? Мне идея подружить query notifications с JMS от уважаемого just_vladimir понравилась - возможно получится это реализовать, но не хочется лезть пока JMS еще вообще не заведена...

MasterZiv " сервер бд выдает стандартным средством ошибку с сообщением, по connectivity она летит клиенту СУБД, который есть твой Glassfish ". Так кто этот таинственный "стандартное средство"? У меня весь сыр-бор начался с его поиска и ненахождения. Я тут и пытаюсь узнать есть ли он вообще в природе. Есть?

П.С.: извиняюсь если я не очень ясно выражаюсь или что-то понимаю не до конца верно - опыта у меня не так много я еще джун, отчаянно тыркающийся в попытках дорасти до мидла:( Всем еще раз спасибо!
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181028
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
если ты можешь получит сообщение в рыбе, какие проблемы с рассылкой? и что за клиенты десктоп, веб?
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181036
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabМожет кто-то подсказать есть ли что-то более нативное для подобных целей?
Вариант 1:
1. https://en.wikipedia.org/wiki/Microsoft_Message_Queuing
2. https://support.microsoft.com/en-us/kb/555070
3. https://javamsmq.codeplex.com/ или http://msmqjava.codeplex.com/

Вариант 2:
Можно написать CLR-хранимку ( http://djekmusic.blogspot.com/2012/06/sql-clr-microsoft-sql-server-2008.html] SQLCLR ), например, на C# (профит: доступны возможности .NET Framework)
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181070
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ключевое слово - дорасти до мидла.
Тогда:
- искать не нативное, а общее средство для всех бд.
- понять что такое декларативное управление транзакциями и обработка ошибок.
Потом уже выбирать по вкусу.
- привести свой код, т.к. форум программистов а не поиска птичьего молока, как здорово написал выше мембер).
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39181072
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Никому эта фишка не помогла. Вспоминаю как страшный сон.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39182011
RuslanGab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВАДЯ, да могу получить сообщение на сервере и дальше отправить клиенту. Просто то как я это делаю по-моему костыли, оттого и пытаюсь найти что-то более нативное.

Usman спасибо. Это интересно, но по-моему куда менее оптимально чем работа через эксепшены в данном случае. Нет!?

Petro123, матчасть подтягивать хочу, пытаюсь делать и буду и дальше пытаться! :)

Код:
еще раз о том что сие есть: Сервер - GlassFish. БД SQL Server. Клиент (хотя это тут не важно конечно) - десктопное приложение на JavaFX.
1. Вот что делает триггер (не "функциональные" части я опуская чтобы не засорять тут все рулонами кодов):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
...
    -- ===================  Statements for trigger  ======================
    if 
      ... AND ...
    OR 
      ... AND 
    -- ====================== If conditions met ==========================
    BEGIN
      ROLLBACK TRAN                                                                         -- Rollback transaktion
      PRINT 'TRIGGER_TestCheckKondition: rollback the transaktion'            -- Message text (показывается при работе с БД!)
      RAISERROR ('TRIGGER_TestCheckKondition: rollback the transaktion',   -- Error message text (Его я получаю на сервере)
                 16,                                                                               -- Error severity
                 16)                                                                               -- Error state
    END
END


2. Вот как я ловлю это на сервере (опять же выдержки):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public abstract class AbstractFacade<T> {

    private EntityManager em;
    private final Class<T> entityClass;

    public T edit(T entity) {
        try {
            T obj = em.merge(entity);  
            em.flush();                            //Чтобы порождаемое триггером исключение возникло тут
            return obj;
        } catch (IllegalArgumentException e) {
            // if instance is not an entity or is a removed entity
            LOG.error(e.getMessage());
            return null;           
        } catch (PersistenceException e) {  //Вот он - костыль:(((
                                               //DatabaseException -> SQLServerException -> exception триггера
            String triggerException = e.getCause().getCause().getLocalizedMessage();    
            System.out.println("GOT TRIGGER EXCEPTION: " + triggerException);
            return null;
        }
    }
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39182040
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGabЭто интересно, но по-моему куда менее оптимально чем работа через эксепшены в данном случае. Нет!?Чисто для данного случая - да - это слишком избыточно. И Вам достаточно сгенерировать исключение.
Предложенные мною варианты - оптимально подходят для долгоиграющих процессов, которые необходимо выполнять фоново/асинхронно.
...
Рейтинг: 0 / 0
Как на сервере получать сообщения от БД?
    #39182186
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuslanGab,
У тебя выхолощеный пример который теряет смысл.
- после try т.е. перехват исключения делают для бизнес логики. Т.к. в логи можно отправить только стек с кдом ошибки или именем класса райзе.
- если вся бл триггерах и бд, то вообще орм jpa и аппСервер не нужен. Исключение подымется до клиента десктопного.
- из бд не слать никаких print и info сообщений.
Только ошибки фатальные.
Imho
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Как на сервере получать сообщения от БД?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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