|
|
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Собственно весь вопрос в теме. Если чуть конкретнее - есть БД SQL Server и сервер GlasFish. В БД крутится триггер, который проверяет в одной из таблиц целостность данных при сохранении (кго алгоритм тут уж роли не играет). В случае неудачи транзакция откатывается. И вот далее интересно: Как донести инфу о том почему именно транзакция не свершилась клиенту? 1. Конкретно в MS SQL триггер может выдать методом PRINT сообщение, которое прочтет админ БД если ему сильно захочется поработать с базой напрямую - отпадает. 2. Я попользовался методом RAISEERROR, в которое упаковал сообщение - это оказалось ближе к истине. На сервере после flush этот exception и "лежащее" в нем сообщение ловятся, но довольно "некрасивым" способом. У меня (используется JPA) вышло так: „PersistenceException“ -> „DatabaseException“ -> „SQLServerException“ -> „Exception от триггера“ с сообщением через getLocalizedMessage(). Мне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей? Заранее спасибо! П.С.: то что проверять можно на клиенте перед сохранением понятно. Как раз и хотелось бы "из спортивного интереса" попробовать получить универсальное решение со стороны самой базы чтобы потом уже с увеличением количества триггеров (а оно в небольшой степени будет в любом случае) не думать ни о чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 01:01 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, посмотри на использование udf. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 07:08 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, все зависит от того в каком режиме это должно работать, если реакция нужна моментально и в этом же потоке, то наверное ваш вариант с выбрасыванием исключения вполне будет работать. В других ситуациях можно по извращаться: 1. Писать в лог таблицу, которая регулярно просматривается демоном в вашем приложении и как то реагирует на появление новых записей. 2. В MS SQL есть штука под названием query notifications, которую можно подружить с JMS. 3. Наверное можно извернуться и отправить http запрос на какой-нибудь ваш сервлет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 12:51 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGabМне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей? этот способ самый простой и эффективный. RAISE "У клиента .... отсутствуют средства на счёте" из триггера Копай его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 14:28 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGabсообщение ловятся, но довольно "некрасивым" способом подробнее. Сообщения нужно делить на уровни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2016, 14:29 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
вадя, с udf не сталкивался - посмотрю. Спасибо. just_vladimir да реакцию нужна сразу. Клиент сохраняет изменения, которые триггер откатывает как невалидные. Конечно ему надо сообщить в чем дело без отлагательств. JMS - очень хорошая мысль. До ее реализации на сервере у нас еще не дошло, хотя это определенно придется сделать. То что MS SQL с ней дружит для меня новость - классно. Не знаю возможно позже я попробую именно этот метод реализовать. Отправлять же дополнительный запрос - ну наверное это можно сделать рабочим методом но по моим ощущениям это потребует больше "костылей" чем мои потуги с вытягиванием сообщения из эксепшена... Спасибо! Petro123 RAISE "У клиента .... отсутствуют средства на счёте" из триггера - ну пока как-то так это и работает в тестовом режиме. Сообщения нужно делить на уровни. - вы имеете ввиду уровень эксепшена в самой БД? Это в триггере конечно делается. Я про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе, да еще и приходится брать причину (getClause() если не ошибаюсь), причем ни один раз. Как-то это противит моему эстетическому чувству:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 15:02 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, есть 2 варианта: - трёхзвенка + БЛ на аппСервере и там разбираемся с исключалками - двухзвенка + БЛ в БД. Логично что разбираются с исключалками возле БЛ. Т.к. надо предпринимать действия при откате. RuslanGabЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе это к врачу....про принципы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 16:44 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab Сообщения нужно делить на уровни. - вы имеете ввиду уровень эксепшена в самой БД? не совсем. Я говорил шире. Если у вас JPA и декларативное управление транзакциями, то вам неизбежно нужно меньше проверять в триггерах и больше в напр. спринге Код: java 1. Exception.class - обработает ваше исключение. ЗЫ Логирование и Сообщения от БД это не ошибки из триггера. Уровни по слоям и уровни по типам ошибок это обратка от сервера БД к пользователю и техподдержке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 17:27 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 17:30 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Petro123RuslanGabЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе это к врачу....про принципы. Вспомнилось. А. Сапковский– Старею, видать, – буркнул ведьмак немного погодя. – Принципы наружу вылезли. – У стариков это бывает. – Мильва с сочувствием глянула на него. – И часто вылезают? Отвар из медуницы, говорят, помогает. И вправлять надо. А пока – клади себе подушечку под зад. – Принципы, – серьёзно пояснил Лютик, – не геморройные шишки. Ты путаешь понятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 18:40 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
авторЯ про "некрасивость" имел ввиду что мне упорно не нравится работать через эксепшены в принципе с этим трудно спорить.. но в аксессе есть такой метод, широко используемый и очень облегчающий код перед тем местом где возможно "исключение" назначается обработчик, и в нем делается , что нужно. правда в аксе есть возможность вернуться в точку возникновения "исключения " и продолжить выполнение, как будто исключения не было. очень помогает , когда требуется куча проверок для недопустимости исключения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 18:57 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
вадяправда в аксе есть возможность вернуться в точку возникновения "исключения " и продолжить выполнение, как будто исключения не было. неужели goto? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 22:03 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, все просто, сервер бд выдает стандартным средством ошибку с сообщением, по connectivity она летит клиенту СУБД, который есть твой Glassfish, далее в его воле делать с этим сообщением что угодно - в частности, послать сообщение своему клиенту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 22:29 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Petro123, если не ошибаюсь on error goto Nebo может поправить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 22:31 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
вадя, за goto в JPA тыщу баксов не платят)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2016, 23:42 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Petro123вадя, за goto в JPA тыщу баксов не платят)). если ты не владеешь темой - не лезь on error goto и простой goto отличаются как небо и земля. on error goto это равносильно try catсh в java, только с фишкой - возарата в точку возникновения этого исключения и продолжения работы с исправленными переменными., а не просто пропуск кода , как в java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 00:16 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGabМне способ 2 НЕ нравится, просто я не нашел лучше. Может кто-то подсказать есть ли что-то более нативное для подобных целей? Не совсем понятно что автор хочет? Что такое более нативное? Не нравится формат стека исключений? Это фикситься своим пользовательким исключением и его обработкой. Может быть автор нам нарисует ИНТЕРФЕЙС своей мечты и пояснит как он хотел-бы получать своё сообщение и в каком виде. В противном случае получается что автор просто капризничает и хочет птичьего молока... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 01:49 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Petro123, spring не используем - варианты с его аннотациями отпадают. Правильно ли я понимаю что так или иначе мне надо на уровне БЛ разбираться с исключениями, т.е. все же ничего адекватнее подъема исключения в самой БД (которое я перехватил на сервере) параллельно с откатом транзакции не имеется (даже если начать теоретически смотреть на Spring и AOP - все же они опять таки будут ловить это же самое исключение но пусть изящнее и проще)!? Тогда выходит что все то же и так же - я триггером откатываю транзакцию и поднимаю исключение - на сервере его ловлю (что мне кажется не оптимальным) и получаю пройдя через несколько "порождающих" исключений таки некое сообщение (или код - не суть), которое так или иначе уже шлю клиенту. Это до чего я сумел доскрипеть и что мне не понравилось (ну Ок - пусть мои сомнения живут и дальше в моей мятущейся и ищущей совершенства душе). Принципиально лучше ничего не существует? Нет библиотек которые могли бы нормально "обмениваться сообщениями" с базой и соответствующих методов "отправки сообщений" в самой БД? Мне идея подружить query notifications с JMS от уважаемого just_vladimir понравилась - возможно получится это реализовать, но не хочется лезть пока JMS еще вообще не заведена... MasterZiv " сервер бд выдает стандартным средством ошибку с сообщением, по connectivity она летит клиенту СУБД, который есть твой Glassfish ". Так кто этот таинственный "стандартное средство"? У меня весь сыр-бор начался с его поиска и ненахождения. Я тут и пытаюсь узнать есть ли он вообще в природе. Есть? П.С.: извиняюсь если я не очень ясно выражаюсь или что-то понимаю не до конца верно - опыта у меня не так много я еще джун, отчаянно тыркающийся в попытках дорасти до мидла:( Всем еще раз спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 02:03 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, если ты можешь получит сообщение в рыбе, какие проблемы с рассылкой? и что за клиенты десктоп, веб? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 02:47 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 05:10 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
Ключевое слово - дорасти до мидла. Тогда: - искать не нативное, а общее средство для всех бд. - понять что такое декларативное управление транзакциями и обработка ошибок. Потом уже выбирать по вкусу. - привести свой код, т.к. форум программистов а не поиска птичьего молока, как здорово написал выше мембер). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 08:40 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
вадя, Никому эта фишка не помогла. Вспоминаю как страшный сон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 08:44 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
ВАДЯ, да могу получить сообщение на сервере и дальше отправить клиенту. Просто то как я это делаю по-моему костыли, оттого и пытаюсь найти что-то более нативное. Usman спасибо. Это интересно, но по-моему куда менее оптимально чем работа через эксепшены в данном случае. Нет!? Petro123, матчасть подтягивать хочу, пытаюсь делать и буду и дальше пытаться! :) Код: еще раз о том что сие есть: Сервер - GlassFish. БД SQL Server. Клиент (хотя это тут не важно конечно) - десктопное приложение на JavaFX. 1. Вот что делает триггер (не "функциональные" части я опуская чтобы не засорять тут все рулонами кодов): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 2. Вот как я ловлю это на сервере (опять же выдержки): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 01:14 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGabЭто интересно, но по-моему куда менее оптимально чем работа через эксепшены в данном случае. Нет!?Чисто для данного случая - да - это слишком избыточно. И Вам достаточно сгенерировать исключение. Предложенные мною варианты - оптимально подходят для долгоиграющих процессов, которые необходимо выполнять фоново/асинхронно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 05:38 |
|
||
|
Как на сервере получать сообщения от БД?
|
|||
|---|---|---|---|
|
#18+
RuslanGab, У тебя выхолощеный пример который теряет смысл. - после try т.е. перехват исключения делают для бизнес логики. Т.к. в логи можно отправить только стек с кдом ошибки или именем класса райзе. - если вся бл триггерах и бд, то вообще орм jpa и аппСервер не нужен. Исключение подымется до клиента десктопного. - из бд не слать никаких print и info сообщений. Только ошибки фатальные. Imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2016, 10:39 |
|
||
|
|

start [/forum/topic.php?fid=59&startmsg=39179425&tid=2124319]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
19ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 340ms |

| 0 / 0 |
