Pavel Denisov, у меня после тупорной замены SQLite на PG скорость обработки неожиданно выросла в 25 раз. Больше вообще ничего не менял. Только драйвер БД. Причем почему тоже не ясно. В SQLite я только флаг обработки писал и все.
Сами данные продолжаю писать в Oracle.
Рост скорости радует, но я хочу попробовать его еще поднять т.к. как я понимаю у меня только одно ядро задействуется.
Pavel Denisov, у меня в SQLite только файлы для обработки писались. Там вопрос был в том, как строки из БД забирать из нескольких потоков одновременно. Проблему я решил используя lock. Скорости от этого я не ждал, просто было не понятно как из нескольких потоков долбиться.
будете смеяться, но до меня тут вообще в качестве БД использовали ini файл и мне ту же SQLite внедрить потребовалось не мало усилий "код уже написано, не вижу смысла его переделывать". Увы такие аргументы у начальства бывают весьма часто.
Иван Шумов, да просто потому что мне сходу не очевидны преимущества очереди. Очередь как я понял из всего написанного гарантирует, что данные будут браться поэлементно и не будет ситуации когда два потока попытаются захватить одну и ту же запись.
Иван Шумов, спасибо, поясните пожалуйста только про захват строки разными потоками. Возможно ли ситуация, пока один поток будет менять флаг "строкаЗанята" второй поток попытается захватить эту же строку и дальше произойдет ошибка. Просто я упорно пытаюсь понять отличие полноценной очереди от этого пусть и костыльного варианта.
Иван Шумов, если бы в документации к sqlite было бы написано, что он однопоточный, у меня вопросов бы не было. А тут получается что он вроде как это умеет.
Я просто не совсем понимаю есть ли в БД какая-то атомарная блокировка или нет. Вот берет первый поток первую строку. Ставит ей флаг, что она в обработке. Получается второй может успеть захватить строку и тоже попытаться флаг поставить? Если так, то это во всех БД так или есть исключения?
Pavel Denisov, это так и есть..)) В чем минусы то блин. В том что два потока одновременно попытаются одну и ту же запись обработать? Так флаги можно напротив строк ставить
Иван Шумов, так а если допустим сделать так: Создаю 100 потоков. Каждый поток ставит напротив файла пометку ФайлВзятВРаботу. Запускам обработку в отдельном потоке через executeShell (или как там его) запускам обработку внутри потока. Отрабатываем файл. Меняем флаг. И тоже самое делаем с остальными 99 потоками. В чем минус? Какие проблемы будут?
Иван Шумов, я имею ввиду, я же из БД могу данные таким же макаром выгребать, зачем мне тогда вообще очередь нужна?
"Документацию почитать лень?"
Документацию по чему? По тому как очередь писать или как обработчики для очереди делать?
"Сообщение должно вернуться в очередь если не дождется сигнала окончания обработки"
Файл был не верного формата предположим. Зачем его обратно в очередь возвращать?