Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
Всем добрый день Недавно вот задумался: Есть множество потоков работающих внутри message broker. Каждый поток пишет логи в оракловскую базу данных. Для получения id новой записи использую последовательность (этим занимается отдельный подпоток, встраеваемый в каждый поток). Однако приходится дважды дёргать базу (первый раз чтобы получить id записи, второй чтобы записать в базу строку с логами). Казалось бы: сделай триггер в базе и получай id записи прямо внутри базы. НО! В случае ошибки внутри потока сообщение откатывается и посылается письмо с id записи в логах (где будет сообщение об ошибке). То есть мне просто необходимо дёргать базу дважды. В начале потока - для получения id из последовательности. И в конце - для записи в базу логов. Хотелось бы избежать первого дёргания. Собственно вопрос: как бы мне из потоков (их много и работают одновременно) получать уникальное, возрастающее, целое число которое я мог бы исползовать как id записи. При этом не используя sequence и вообще не исползуя базу данных. Думал в направлении shared memory и ноды на java, но не сообразил ничего путного. Кроме того: что будет если перезагрузится сервер? Значение всё равно должно увеличиваться... Пока самое лучшее решение, которое придумал: есть отдельный поток - кладёт в очередь сообщения с этим самым возрастающем id. Другие потоки черпают сообщения и используют. Если сообщения нет, то пинают тот поток и ждут, пока он не выложит сообщение (нода MQGet). Вроде бы работать будет, но напоминает карточный домик - того и гляди развалится. Есть у кого мысли в тему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 07:23 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
Какое отношение это имеет к IBM? Воспольуйтесь PL/SQL, напишите для вставки хранимую процедуру. (В DB2 это не нужно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 09:34 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
TAlex62Казалось бы: сделай триггер в базе и получай id записи прямо внутри базы. в этом случае триггер не нужен. insert values(seq.nextval,...) TAlex62Хотелось бы избежать первого дёргания. Непонятна цель избежания. Чисто эстетическая? Какие реальные проблемы связаны с первым дерганием? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 11:14 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
шубин_ду, Цель такая: несколько брокеров, следовательно несколько (одинаковых по структуре) баз с логами. Хотелось бы сквозной id на записи в логах. ОДин на все базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 11:24 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
TAlex62шубин_ду, Цель такая: несколько брокеров, следовательно несколько (одинаковых по структуре) баз с логами. Хотелось бы сквозной id на записи в логах. ОДин на все базы А почему не дергать id только из одной базы и использовать его для всех баз? Или каждый брокен имеет доступ только к своей базе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 11:37 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2011, 11:41 |
|
||
|
как для множества потоков получить уникальный id записи для логирования в базе данных
|
|||
|---|---|---|---|
|
#18+
Текущий день с начала веков :) * коэффициент + текущий час * коэффициент+ текущая минута * коэффициент + текущая секунда * кэффициент. При правильном подборе коэффициентов должно работать. Синтаксис типа : DECLARE IN INTEGER EXTRACT(DAY FROM CURRENT_TIMESTAMP); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2011, 21:10 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=37422538&tid=1602125]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 321ms |
| total: | 598ms |

| 0 / 0 |
