|
|
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Всем здравствуйте. Прошу совета по вопросу решения достаточно стандартной задачи. Несмотря на её стандартность, в доке по апексу решения не нашёл, а вешать процесс на таймаут не очень хочется. Задача - бронирование неких ресурсов (в моём случае - посадочных мест). Т.е., есть центральная база Oracle, на ней APEX, в нём приложение, с помощью которого пользователи "занимают" место. Вопрос в том, как организовать автоматическое обновление некоего списка свободных мест по событию. Грубо говоря, когда один пользователь занял место (видимо, это будет некий insert в табличку) - остальные, у которых открыта эта страница, должны увидеть "покрасневшее" место. Я пока не придумал ничего умнее, чем раз в 2 секунды запускать процесс и проверять места. Но это совсем не то, чего мне на самом деле хочется. Во-первых, генерируется достаточно большая (и ненужная) работа даже при отсутствии событий. Во-вторых... как-то это тупо, что ли? В общем, прошу натолкнуть меня. Использовать что-либо, кроме APEX, не хотелось бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 08:43 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Сентябрин, Для лучшего решения нужно завести в таблице поле с датой последнего обновления и индекс по нему. В итоге каждые n секунд пулять ajax с условием POLE>sysdate-1/24/60 например. То есть каждые n секунд мы проверяем данные, которые изменились за последнюю минуту. С индексом будут быстро возвращаться 0 строк. Сомневаюсь что это создаст большую нагрузку. Сканить можно например каждые 10 секунд. В итоге самое долгое ожидание будет 10 секунд, хотя можно попасть в случай когда мы увидим измененное место спустя всего 1 секунду. Если же основная таблица очень большая, можно завести какую-нибудь буферную таблицу, которая хранит данные только за последний день и каждый день ее чистить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 09:34 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Gustly, Вопрос, как я понял, не в том. Автор и сам определился как это сделать технически. Меня тоже как то интересовал этот вопрос, что бы не делать постоянные опросы на изменение состояния системы. Надо что бысам сервер посылал клиенту комманду на обновление, но дело в том что в http соединение не держися постоянно(специфика протокола), поэтому сервер не может посылать клиенту запросы, только наоборот, НО... Кто то мне подсказал, что может и это Server Push Мне тоже интересна эта тема, так что если что то получится, то опубликуйте, пожалуйста, здесь решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 10:34 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Да я примерно так и сделал. Только у меня сейчас раз в две секунды. Но мне кажется это диким. Неужели нет каких-то нормальных событий и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 10:43 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 11:09 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
СентябринНеужели нет каких-то нормальных событий и т.п. сам я подобное в простом варианте делал только через обычный htmldb_get + settimeout, но, можете попробовать воспользоваться плагинами: http://www.oracle.com/technetwork/developer-tools/apex/application-express/apex-plug-ins-182042.html Timer (в комбинации с dynamic action execute pl/sql code можно возвращать результат в айтемсы периодически) Notification http://www.apex-plugin.com/ Notification Alertify ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 12:35 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Дак автор как раз не хочет этого. Что бы клиент постоянно опрашивал сервер на изменение, если даже этих самых изменений и не было. А хочет, что бы как данные поменялись в БД сервер сам оповестил клиент что данные можно забрать. Автор, так ли это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 14:07 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
kasik, Ну вон ему кинули вариант с nodejs. Вроде не очень сложно и даже интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 14:52 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
kasik, Помойму, Long Polling редко используется в вебе, и мне не показалось, что ТС любитель набивать шишки. Что касается апекса, текущая архитектура не позволяет реализовать механизм, т.к. веб сервер сначало делает запрос к базе, и только когда страница будет полностью помещена в буфер, начнет считывать его, после чего соединение закроет. Разве что использовать что-то кроме апекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 15:04 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
SvDev, Вот и мне интересна была это тема, только до конца анализ не провел а только вот зацепку... Про закрытое соединение писал выше... Просто, как и автор, ситуацию с опросом сервера каждые 1-2 сек считаю не оч локаничной) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 15:09 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
kasik, Например тот же яндекс, судя по консоли, каждые 10 минут опрашивает письма. В данном случае лучше увеличить время до 10-20 секунд. Или ставить nodejs, comet вроде не ахти вариант и мало где используется. За дополнительными сведениями думаю лучше в раздел HTML. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 15:14 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Gustly.... За дополнительными сведениями думаю лучше в раздел HTML. JavaScript наверное, у них там и подраздел соответствующий есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 15:31 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
kasik, HTML, JavaScript, VBScript, CSS Это один большой раздел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 16:35 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за развитие дискуссии, надеюсь, она не сразу затухнет. SvDev Что касается апекса, текущая архитектура не позволяет реализовать механизм, т.к. веб сервер сначало делает запрос к базе, и только когда страница будет полностью помещена в буфер, начнет считывать его, после чего соединение закроет. Разве что использовать что-то кроме апекса. Собственно, после этого мне стало понятно, что без внешних средств не обойтись. Я погуглил по вебоскетам (ещё одно спасибо!), но меня смутила необходимость, фактически, поднимать ещё один сервис, как я понял node.js. Ну, во всяком случае, он выглядит как сервис. И ещё беспокоит стабильность этого решения. Поэтому спрошу - кто-то делал подобное на node.js? Увеличить до 10 секунд в моём случае означает увеличить вероятность того, что меня прибьют за параллельное бронирование одного и того же места :) Возможно, я выбрал не самый удачный инструмент для реализации задачи, но есть другие обстоятельства, которые повлияли на это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 17:10 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Сентябрин... меня прибьют за параллельное бронирование одного и того же места :) Это уже задача не только клиента. Решение: блокировки на уровне БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 17:21 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
kasikСентябрин... меня прибьют за параллельное бронирование одного и того же места :) Это уже задача не только клиента. Решение: блокировки на уровне БД. Кстати, да. Ради этого даже хотел создать отдельную ветку. Но пока не выработал собственного решения, может, подскажете что-то и в этом направлении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 20:17 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Точнее сказать, я что-то увлёкся интерфейсом в ущерб блокировкам базы. Меня захватила проблема отсутствия событий как таковых. Вот теперь экспериментирую с node.js благодаря форуму. Я же правильно понимаю, что в плане контроля занятия ресурсов на стороне БД есть определённые паттерны? Просто я никогда не занимался этой темой, и подсказать сейчас некому. Но изобретать двухколёсный велосипед, едущий задом наперёд, мне бы сильно не хотелось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2014, 20:24 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
С Apex вполне уживается технология SSE (server sent events). Например, если нужно обновить регион (репорт) по изменению данных в таблице, можно сделать так: на загрузку страницы повесить инициализацию обработчика sse, в url для которого указать процесс уровня приложения, который будет ожидать нужное событие, например, через механизм алертов или через pipe. Алерты или сообщения в pipe будут генерироваться триггером БД, отслеживающим нужные нам изменения данных в таблице. Pipe в данном случае надёжней. Как минимум один пример использования SSE с Apex в сети есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2014, 08:46 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
non-apexoid, Интересно! Сентябрин, Тебе уже много накидали вариаций, так что можно совместить эти технологии (node.js or SSE и lock db). Так что выкладывай результаты когда что то получится) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2014, 09:41 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
Проверку можно сделать тупо в триггере перед апдейтом. Если значение поля уже "занято" и пытаются занять опять, то ругаться. И все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2014, 09:57 |
|
||
|
Автоматическое обновление по событию у другого клиента
|
|||
|---|---|---|---|
|
#18+
СентябринТочнее сказать, я что-то увлёкся интерфейсом в ущерб блокировкам базы. Меня захватила проблема отсутствия событий как таковых. Вот теперь экспериментирую с node.js благодаря форуму. Я же правильно понимаю, что в плане контроля занятия ресурсов на стороне БД есть определённые паттерны? Просто я никогда не занимался этой темой, и подсказать сейчас некому. Но изобретать двухколёсный велосипед, едущий задом наперёд, мне бы сильно не хотелось. Если нужно гарантировать целостность данных, то, например, unique constraint (или unique function based index, если того структура требует) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2014, 12:39 |
|
||
|
|

start [/forum/topic.php?fid=50&msg=38743809&tid=1875236]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
175ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 494ms |

| 0 / 0 |
