|
|
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
Ситуация следующая. В конструкторе формы вызывается некоторое кол-во потоков для инициализации визуальных компонентов. Данные для заполнения списков, комбобоксов и т.п. тянутся из базы, именно поэтому используются отдельные потоки. И теперь вопрос, если в одном из потоов возникло исключение, то как его правильно обработать? По идее, раз форма не инициализируется хотелось бы выдать сообщение об ошибке и обнулить указатель на форму. Только вот как это сделать из потока её создающего? Возможно я неправильно подхожу к инициализации визуальных компонентов - тогда направьте на путь истинный плз :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 10:07 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
В принципе, никто не отменял проверку, скажем, глобальной переменной и метод wait + посылку сообщений другим потокам. Но тут есть несколько проблем: 1. В общем случае, запрос к базе прерван быть не может (во всяком случае, на стороне сервера он отработает до конца, а вызывающий метод будет ждать результатов), а поскольку все эти запросы почти наверняка намного медленнее, чем запуск потоков их использующих, то прервать поток можно только на этапе fetch и возможной постобработки уже готовых результатов. 2. Правильно спроектированный пользовательский интерфейс (я сейчас не про отчетную форму), не должен заставлять ждать своего появления на экран больше 3-5 секунд. Если принять, что вы хотите ускорить самую медленную операцию, а именно, выборку из базы данных, то получаем, что макс. время зависит от самого медленного обращения к базе (предположим, что все запросы выполняются параллельно). Таким образом, эта, самая медленная, операция не должна занимать больше 3-5 секунд. Тогда наихудшее время отклика на возможную ошибку не превосходит этих 3-5 секунд. Не проще ли в таком случае дождаться выполнения всех потоков и по их завершении просто рассмотреть не завершился ли хотя бы один с ошибкой? Не говоря уж про то, что вы же наверняка не рассматриваете вариант с появлением ошибки как сколь-нибудь частый и реальный? Так какой смысл ускорять на пару секунд обработку ошибки, которая в принципе вообще не должна возникать? P.S. В JAVA нет такого понятия как указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 11:00 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
carper Но тут есть несколько проблем: 1. В общем случае, запрос к базе прерван быть не может (во всяком случае, на стороне сервера он отработает до конца, а вызывающий метод будет ждать результатов), а поскольку все эти запросы почти наверняка намного медленнее, чем запуск потоков их использующих, то прервать поток можно только на этапе fetch и возможной постобработки уже готовых результатов. Данные потупают с application сервера в виде xml. Натолкнулся на то, что иногда xml-ник приходит битый, вот тут и надо что-то предпринимать - либо пытаться инициализировать форму по-новой, либо выгружать приложение. carper Не проще ли в таком случае дождаться выполнения всех потоков и по их завершении просто рассмотреть не завершился ли хотя бы один с ошибкой? Как я сразу не додумался? Тем более что все равно я дожидаюсь окончания их работы для того чтоб убрать окно ожидания :-) Спасибо. carper P.S. В JAVA нет такого понятия как указатель. Сори, оговорился :-) Тяжелое наследие С++ :-) Конечно же "обнулить ссылку". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 11:15 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
jet8 Данные потупают с application сервера в виде xml. Натолкнулся на то, что иногда xml-ник приходит битый, вот тут и надо что-то предпринимать - либо пытаться инициализировать форму по-новой, либо выгружать приложение. Замечание не совсем по делу, но не могу удержаться: Приход битого xml - это серьезная проблема, с которой срочно надо разбираться (и это проблема совсем не вашей бедной JAVA программы), т.к., в общем случае, возможен самый страшный вариант - приход битого xml замаскированного под небитый, например, со слегка перевранной цифрой. Не говоря уж про то, что application server, выдающий битые файлы - это ЧП и попытка обойти это на клиенте столь же разумна, как лечение гангрены путем завязывания пациенту глаз - чтобы не видел, что у него там. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 11:24 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
2 carper: Может, в зависимости от RDBMS (крупные RDBMS типа MS SQL или Oracle эту фишку поддерживают). Протокол Statement содержит метод Cancel который как раз для этого и нужен. 2 jet8: Обработка исключений путем анализа переменной это один из возможных вариантов. Альтернативный вариант (ИМХО лучший и более правильный) использование Callable interface который позволяет возвращать значения и использовать exceptions. По поводу XML, проблема может состоять в типе протокола который вы используете для связи с сервером (UDP или HTTP/TCP). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 12:49 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
2 Carper: Сорри имелась ввиду следующая фраза: авторВ общем случае, запрос к базе прерван быть не может (во всяком случае, на стороне сервера он отработает до конца, а вызывающий метод будет ждать результатов), ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 12:52 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
OU Альтернативный вариант (ИМХО лучший и более правильный) использование Callable interface который позволяет возвращать значения и использовать exceptions. За науку спасибо :-) Надо будет получше изучить новые возможности в возможности Java 5. OU По поводу XML, проблема может состоять в типе протокола который вы используете для связи с сервером (UDP или HTTP/TCP). Протокол HTTP. Я понимаю, что TCP/IP у нас с гарантированной доставкой, поэтому сам удивляюсь откуда там ошибки. Экзепшн вылазит в парсере, с ругательствами на некорректную структуру. Да и было это всего пару раз за всё время разработки. Но значение ошибки здесь вторично, вместо неё может быть любая другая, главное что я хотел выяснить - как правильно обрабатывать исключения в таких случаях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 14:39 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
2 jet8: По поводу проблем с форматом XML один вариант - проверить соответствие версий DTD используемых на сервере и клиенте (ну или другой ваш компонент). Второй вариант подразумевает что вы не используете XML схемы и ошибка возможна на стороне сервера при создании XML документа. Здесь только проверка логики кода поможет (JUnit, assertions. Возможно AVC будет полезен, но не факт). ИМХО второй вариант выглядит более вероятным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 14:56 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
jet8Ситуация следующая. В конструкторе формы вызывается некоторое кол-во потоков для инициализации визуальных компонентов.....По идее, раз форма не инициализируется хотелось бы выдать сообщение об ошибке и обнулить указатель на форму Что то такое делать в конструкторе это очень плохо именно поэтому. Делаем так - форма это представление и не его вина, что модель не впоряде. т.е. форма создаётся и отбражается, стартуют потоки загрузки. используя SwingWorker можно в основном потоке обработать результат загрузки. Я делал так в потоке загрузки ловил исключение и в этом случае его возвращал, если всё нормально возвращал загруженные данные для заполнения SwingModel'и. Если не понятно напешу па падробнее. Чувствуете - вам уже нужно RCP. (забыл - форму на время загрузки - disable). Но творить гадости в конструкторе - bad smell. и на кой ляд вам толстый клиент? (причины?) и откуда берётся xml? какой транспорт используете? как логика организована? спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 15:07 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
OU Может, в зависимости от RDBMS (крупные RDBMS типа MS SQL или Oracle эту фишку поддерживают). Можно? только применительно НЕ к Statement, а к SQL PLUS или там PL/SQL показать реализацию такого прерывания для Oracle? Т.е. я точно знаю, что в том же SQL PLUS есть такая возможность, но никак не могу вспомнить как это выглядит в виде команды/процедуры? Помню, что что-то такое давно пытался делать (сильно подозреваю, что что-то на С мутил), но фишка была в том, что Oracle слушался далеко не всегда, т.е. иногда просто игнорировал, а иногда возвращал управление, но процессор и диск продолжал грузить задачей. -------------------------- Кстати, если я правильно понимаю, то даже если такой метод для Statement и сработает, то понадобится отдельный поток, который должен вызвать cancel (ну не полагаться же на stmt.setQueryTimeOut), т.к. тот поток, который выполняет query, выполняет блокирующий метод. Т.е. понадобится доп. поток (в идеале один, если организовать диспетчер принудительного завершения потоков), который будет принимать запрос от "аварийного" потока на закрытие запросов инициированных другими потоками. Причем ourStatement.cancel() - в свою очередь, блокирующий метод? (или нет?). Думаю, что такое усложнение в данном конкретном случае не совсем оправдано. Вот если мы городим форму отчетности, то это имеет смысл, причем большой. :) По поводу XML, проблема может состоять в типе протокола который вы используете для связи с сервером (UDP или HTTP/TCP). Использовать UDP для получения значимых данных, да еще с последствиями в виде неверного парсинга xml? Не думаю, что такое разумно. P.S. "использование Callable interface" - это ведь только с SE 5.0 есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 15:22 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
expp Чувствуете - вам уже нужно RCP. (забыл - форму на время загрузки - disable). Но творить гадости в конструкторе - bad smell. А что такое "RCP"? И почему инициализация формы в её конструкторе - "гадости"? Тем более что в конструкторе у меня просто вызывается метод, который и стартует потоки инициализации. Т.е. форма в любом случае отобразится, но вот заполнятся ли данными визуальные компоненты уже зависит от успешной отработки потоков. expp и на кой ляд вам толстый клиент? (причины?) и откуда берётся xml? какой транспорт используете? как логика организована? спасибо. Толстый клиент т.к. переписывается приложение с С++. Вся логика уже реализована в хранимых процедурах. С прицелом перехода на трёхзвенку использую application server, кроме того некоторые преимущества он дает уже сейчас. На application server валяется сервлет, которыё получает запрос в виде xml, т.е. грубо говоря имя вызываемой процедуры и параметры. Вызывает эту процедуру и формирует ответный xml. Вот и вся логика :) Возможно подход несколько ламерский, но честно говоря это моё первое крупное приложение на Java, так что прошу ногами не пинать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 15:44 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
jet8 Толстый клиент т.к. переписывается приложение с С++. Вся логика уже реализована в хранимых процедурах. Ну и глупость написал :) Имелось ввиду что клиент как раз тонкий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 15:57 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
expp и откуда берётся xml? XML берется как универсальный формат передачи данных легко проламывающийся через все ограничения PROXY и платформы. Поскольку за все приходится платить, то в 90% случаев он и нафиг не нужен, зато создает излишнюю нагрузку на клиента и сервер. :) Зато модно. :) и на кой ляд вам толстый клиент? (причины?) Можно уточнить, что вы понимаете под "толстым" коиентом? Классический вариант, когда большинство обработки информации идет на клиенте или современный , когда на откуп клиенту отдано отображение информации и весьма небольшая часть бизнес правил, ответственная за контроль правильности ее ввода информации (только та, которая повышает usability, не затрагивая проверку коррекности данных на сервере)? Чуствую, что написал непонятно, но сейчас почему-то часто "толстым" обзывают даже тех весьма поджарых клиентов, которые не считают нормальным предоставлять интерфейсную часть в виде убогих HTML формочек, рассчитанных на сферического среднего пользователя Интернет. :) jet8 Тем более что в конструкторе у меня просто вызывается метод, который и стартует потоки инициализации. По-хорошему, форма не должна напрямую лезть к модели, ей должно быть фиолетово, что там и почему вызывается, пусть контроллер обратится за данными к модели, и, в завимости от результата, выдаст ту или иную форму. :) Но частенько из сладкой тройки MVC, устраивают сладкую парочку M+ VC. Особого преступления здесь зачастую нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 16:24 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
2 carper: авторТ.е. я точно знаю, что в том же SQL PLUS есть такая возможность, но никак не могу вспомнить как это выглядит в виде команды/процедуры?В MS SQL - kill(procedure id), в Oracle - SQL plus это Ctrl+c, a коммандно что то типа system kill session (session id) авторКстати, если я правильно понимаю, то даже если такой метод для Statement и сработает, то понадобится отдельный поток, который должен вызвать cancel (ну не полагаться же на stmt.setQueryTimeOut), т.к. тот поток, который выполняет query, выполняет блокирующий метод... как это реализовать дело ваше. смотрите в сторону соответствующей архитектуры и дп авторИспользовать UDP для получения значимых данных, да еще с последствиями в виде неверного парсинга xml? Не думаю, что такое разумно. а я и не предлагал использовать в данном случае UDP, как раз наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 16:33 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
carper По-хорошему, форма не должна напрямую лезть к модели, ей должно быть фиолетово, что там и почему вызывается, пусть контроллер обратится за данными к модели, и, в завимости от результата, выдаст ту или иную форму. :) Но частенько из сладкой тройки MVC, устраивают сладкую парочку M+ VC. Особого преступления здесь зачастую нет. Видимо я несколько туманно объяснил. Если бы речь шла об отображении рабочих данных, т.е. результатов запроса клиента, тогда ты полностью прав и я так и поступаю. Но у меня грузятся различные списки и деревья значений, которые лежат в таблицах базы. Они грузятся один раз при инициализации формы, для того чтоб юзверь мог задать нужные значения в комбобоксах и, соответсвенно, деревьях. Форма создаётся один раз, в дальнейшем она либо прячется либо обновляется. Т.е. грубо говоря то что обычно вбивается в приложение руками (списки и деревья значений) я гружу из базы. Т.к. нужна динамика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 16:42 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
OU a коммандно что то типа system kill session (session id) Неа, что-то типа alter system kill session '286,9195', разумеется, убьет и запрос, но такое ощущение, что SQL PLUS делает это иначе, т.к. ,даже если он маскирует сообщение системы и перелогинивает пользователя в автоматическом режиме, то что-то это у него получается феерически быстро. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 16:58 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
2 carper: авторно такое ощущение, что SQL PLUS делает это иначе, т.к. ,даже если он маскирует сообщение системы и перелогинивает пользователя в автоматическом режиме, то что-то это у него получается феерически быстро. Возможно, наверняка где то должно быть описание принципов работы sql+. В крайнем случае быстро убить процесс можно и из операционки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 17:10 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
--> А что такое "RCP"? ищите в форуме и обрящите. -->И почему инициализация формы в её конструкторе - "гадости"? Тем более что в конструкторе у меня просто вызывается метод, который и стартует потоки инициализации. этот старт может закончится Exception'оm ... а теперь если это был ещё один вызов конструктора в болезненной цепочке вызова конструкторов вашего гуя...сколько конструкторов доч.объектов вы уже вызвали и сколько из них зарегистрировались на прослушку долгоживущих моделей .... [рамка: конструктор пустым, а голову в кепке] ну или подумайте о том, что эти данные нужно перегрузить и вынесите старт потоков загрузки в отдельный метод. -->Толстый клиент т.к. переписывается приложение с С++. под толстым я понимаю GUI, под тонким Web. моё мнение GUI клиент на Swing - топор, и без RCP делать это ни нада. Web-ня помоему рулит и нужны баальшие причины, чтоп от неё отказаться. про решение на сервлетах и xml уже от кого-то слышал, но ... нипанимаю я почему именно так. -->Ну и глупость написал :) Имелось ввиду что клиент как раз тонкий. что то я ни вкачал .... 2 carper вы с jet8 - sweet pair, что ли? кто за кого отвечает? туда же: я лична зарёкся трактовать MVC, где у него, что по-моему никто не знает. туда же: причём здесь JDBC Statement - как я понял у него xml транспорт и потоки сервлет, а не RDBMS. --> Они грузятся один раз при инициализации формы,... Что за жесть??? Это с чего ... форма создаётся когда угодно, хоть все скопом при запуске клиента. А грузится она когда надо: перед отображением, по тычку, раз в пол часа ... и т.д. зачем вы излишне связываете жизненные циклы представления и модели ... а если вторая форма кажет те же данные они их теперь будут вместе два раза загружать ... а если понадобится два экземпляра этой формы .... всем пивет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 17:51 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
expp туда же: я лична зарёкся трактовать MVC, где у него, что по-моему никто не знает. Не знаю, я бы попробовал так: Давайте, например, возьмем простейшую страничку, html или там jsp с формочкой или просто ссылкой. Даванем на ссылку (скажем запросим ФИО какого-нибудь поэта), далее возможны два пути: Путь A. 1. Со странички запросим базу данных, не важно грубо через select или через n-промежуточных слоев. Главное, что мы конретно указали что-то нам нужен конкретный результат, причем не просто, мол хотим ФИО, а придется написать типа select FIO form myaddress (или более общий запрос, хотя сам SQL и так вполне себе абстрактный язык); 2. Получим результат, сами обработаем ошибки, сами занесем данные в атрибуты и вызовем новую форму, которая должна знать, что делать с этими данными. Т.е. получили классический вариант срощенного контроллера и представления, когда само представление решает, что именно ему нужно и что с полученным результатом делать. ( Ввиду событийно-ориентированного программирования, те же приложения на swing очень часто не разделяют представления от контроллера, просто навешиваем листнеры и в них фигачим обработку событий.) Путь B. 1. Сообщаем классу-контроллеру, что у нас нажата ссылка. 2. Контроллер обращается к базе (опять же напрямую, или через n слоев) - уже он, а не форма, говорит, что ему нужно. 3. Он получает запрошенную информацию и вызывает новую jsp/html страничку, в зависимсти от необходимого результата (например, error.jsp). Что же дает второй вариант? 1. Один контроллер может обслуживать сколько угодно страничек и изменения, в случае чего, можно вносить только в одном месте. 2. Страничку можно ваять не заботясь о какой-то там JAVA, что ей надо когда из себя отфорвардить и как чего закодировать, а сосредоточиться только на интерфейсе, априори будучи уверенным, что все нужные данные появятся как по волшебству. :) 3. Код всего приложения приобретает больше возможностей для параллельной разработки, когда скажем web дизайнер не ждет JAVA программиста и наоборот. 4. Возможно введение диспетчера контроллеров, который может распределять нагрузку между контроллерами и использовать разнородные контроллеры. Ну, где-то так, извиняйте ежели что не то сказал. :) >причём здесь JDBC Statement - как я понял у него xml транспорт и потоки >сервлет, а не RDBMS Не причем, просто сначала было не ясно (см. первоначальный вопрос), а потом возник шкурный вопрос - как прервать запрос к Oracle без убийства сессии? :) > carper вы с jet8 - sweet pair, что ли? кто за кого отвечает? Нет уж, я вообще отвечать ни за кого не люблю, даже за себя. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 19:12 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
expp --> Они грузятся один раз при инициализации формы,... Что за жесть??? Это с чего ... форма создаётся когда угодно, хоть все скопом при запуске клиента. А грузится она когда надо: перед отображением, по тычку, раз в пол часа ... и т.д. зачем вы излишне связываете жизненные циклы представления и модели ... а если вторая форма кажет те же данные они их теперь будут вместе два раза загружать ... а если понадобится два экземпляра этой формы .... всем пивет Повторю ещё раз. Форма создается ОДИН раз. При её создании загружаются нужные значения для инициализации списочных компонентов (для ИНИЦИАЛИЗАЦИИ, а не отображения данных запрошенных пользователем). А уже потом происходят тычки пользователя по кнопке "обновить" и т.д. Когда форма не нужна - HIDE_ON_CLOSE, и её не надо повторно создавать прогружая списки и лишний раз обращаясь к базе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.05.2006, 22:45 |
|
||
|
Правильная обработка исключений
|
|||
|---|---|---|---|
|
#18+
jet8 Повторю ещё раз. Форма создается ОДИН раз. При её создании загружаются нужные значения для инициализации списочных компонентов (для ИНИЦИАЛИЗАЦИИ, а не отображения данных запрошенных пользователем). А уже потом происходят тычки пользователя по кнопке "обновить" и т.д. Когда форма не нужна - HIDE_ON_CLOSE, и её не надо повторно создавать прогружая списки и лишний раз обращаясь к базе. ну я смотрю, что бесполезно ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2006, 00:01 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33728408&tid=2149265]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 204ms |
| total: | 334ms |

| 0 / 0 |
