Работа с базой данных MySQL [Многопоток]

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Всем привет! Есть задача:

Сделать запрос к базе данных, получить список активных сессий и обрабатывать каждую сессию в определённом потоке, есть готовый пример шаблона но работает в один поток, если поставить больше потоков то не идёт распределение сессий между потоками! Видимо я что то напутал в логике.

Подскажите как можно сделать реализацию?

Скрин текущий логики:

p/s. просьба не ржать с комментариев в блоках)))
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 223
Баллы
113

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Последнее редактирование:

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Я беру строки из базы данных, заношу их в список, потом беру строки из списка с удалением, по идее списки должны быть синхронизированы в многопотоке!
Но увы три потока берут одну и ту же строку.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Я беру строки из базы данных, заношу их в список, потом беру строки из списка с удалением, по идее списки должны быть синхронизированы в многопотоке!
Но увы три потока берут одну и ту же строку.
1. Список должен быть привязан к файлу.
2. Логика должна быть реализована таким образом, чтобы только один поток работал с БД и заполнял список, а остальные этого ждали (если логика должна быть завязана на использовании локального списка)
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
1. Список должен быть привязан к файлу.
2. Логика должна быть реализована таким образом, чтобы только один поток работал с БД и заполнял список, а остальные этого ждали (если логика должна быть завязана на использовании локального списка)
Постой, как я привяжу список к файлу если список наполняется из базы данных? И как можно заполнять список одним потоком, а потом работать со списком другими потоками?
Что-то пока не представляю как это можно реализовать)
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Постой, как я привяжу список к файлу если список наполняется из базы данных? И как можно заполнять список одним потоком, а потом работать со списком другими потоками?
Что-то пока не представляю как это можно реализовать)
вне кода ожидание потоками и не реализовать)
Проще пойти мимо списка. Добавить в таблицу бд один столбец, дополнительный идентификатор (его мы будем генерировать случайным образом перед апросами). А каждый поток будет делать по 2 запроса в бд.
1й запрос - update одной строку, где дополнительный столбец пусто. Апдейтить его мы будем тем значением, что сгенерировали ранее.
2й запрос - select строки, где доп. столбец равен нашему сгенерированному значению. С этой строкой и будет работать поток
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
вне кода ожидание потоками и не реализовать)
Проще пойти мимо списка. Добавить в таблицу бд один столбец, дополнительный идентификатор (его мы будем генерировать случайным образом перед апросами). А каждый поток будет делать по 2 запроса в бд.
1й запрос - update одной строку, где дополнительный столбец пусто. Апдейтить его мы будем тем значением, что сгенерировали ранее.
2й запрос - select строки, где доп. столбец равен нашему сгенерированному значению. С этой строкой и будет работать поток
Спасибо за совет! Попробую сделать такую реализацию.
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
вне кода ожидание потоками и не реализовать)
Проще пойти мимо списка. Добавить в таблицу бд один столбец, дополнительный идентификатор (его мы будем генерировать случайным образом перед апросами). А каждый поток будет делать по 2 запроса в бд.
1й запрос - update одной строку, где дополнительный столбец пусто. Апдейтить его мы будем тем значением, что сгенерировали ранее.
2й запрос - select строки, где доп. столбец равен нашему сгенерированному значению. С этой строкой и будет работать поток
Сделал всё так как ты сказал, это на самом деле прекрасное решение, но.

Текущая логика шаблона:
Получаем общее активных количество сессий в базе запросом "SELECT COUNT(*) FROM `online`".
Если возвращает 0 смотрит снова и так до тех пор пока не появится сессия, одна или несколько.
Появилась сессия: генерируем уникальный id.
Задаём уникальный id для одной сессии запросом "UPDATE `online` SET `idzenno` = '{-Variable.idzenno-}' WHERE `idzenno` = '' LIMIT 1".
Получаем строку сессии запросом "SELECT `session_id` FROM `online` WHERE `idzenno` = '{-Variable.idzenno-}'".
Удаляем полученную строку из базы "DELETE FROM `online` WHERE `session_id` = '{-Variable.current_session-}'
Далее идёт дальнейшая обработка сессии...

Но дело в том что при текущей логике и запуске в несколько потоков допустим 2, первый или же второй поток получает сессию и делает всё верно,
а второй поток думает что есть ещё сессия и пытается её получить в то время когда не какой сессии в базе нет(
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 223
Баллы
113

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Сделал всё так как ты сказал, это на самом деле прекрасное решение, но.

Текущая логика шаблона:
Получаем общее активных количество сессий в базе запросом "SELECT COUNT(*) FROM `online`".
Если возвращает 0 смотрит снова и так до тех пор пока не появится сессия, одна или несколько.
Появилась сессия: генерируем уникальный id.
Задаём уникальный id для одной сессии запросом "UPDATE `online` SET `idzenno` = '{-Variable.idzenno-}' WHERE `idzenno` = '' LIMIT 1".
Получаем строку сессии запросом "SELECT `session_id` FROM `online` WHERE `idzenno` = '{-Variable.idzenno-}'".
Удаляем полученную строку из базы "DELETE FROM `online` WHERE `session_id` = '{-Variable.current_session-}'
Далее идёт дальнейшая обработка сессии...

Но дело в том что при текущей логике и запуске в несколько потоков допустим 2, первый или же второй поток получает сессию и делает всё верно,
а второй поток думает что есть ещё сессия и пытается её получить в то время когда не какой сессии в базе нет(
Потому что оба потока получают количество сессий в одно время. Зачем вообще его запрашивать? Ты делаешь апдейт. Насколько я помню, в мускуле, например, update возвращает затронутое число строк. От того и отталкивайся. Если затронутое число ноль - значит в базе нет сессий, удовлетворяющих критерий.
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Потому что оба потока получают количество сессий в одно время. Зачем вообще его запрашивать? Ты делаешь апдейт. Насколько я помню, в мускуле, например, update возвращает затронутое число строк. От того и отталкивайся. Если затронутое число ноль - значит в базе нет сессий, удовлетворяющих критерий.
Ты верно говоришь, но дело в том что в Zennoposter'е в ответ на update не приходит нечего, даже если были затронуты строки.
Вот посмотри сам: http://prntscr.com/k5pdkr
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
  • Спасибо
Реакции: Martin Rigs

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

yriy158

Client
Регистрация
10.08.2013
Сообщения
491
Благодарностей
301
Баллы
63
Не кто и не говорит про списки, всё сделано на MySQL.
Док все верно тебе пишет, особо хитрить там не нужно. Делешь доп. столбец в таблице БД с уникальным автоинкремент (помоему так оно называется) значением, то есть, каждой строке будет соответствовать уникальный цифровой индекс. Дальше в шабе генерируеш рандомное значение этого индекса в пределах индекса с столбца БД и дергаешь по этому рандомному индексу нужные данные. Глянь скрин который я когда-то выкладывал в теме, должно быть понятно


Вот сама таблица с БД
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
Док все верно тебе пишет, особо хитрить там не нужно. Делешь доп. столбец в таблице БД с уникальным автоинкремент (помоему так оно называется) значением, то есть, каждой строке будет соответствовать уникальный цифровой индекс. Дальше в шабе генерируеш рандомное значение этого индекса в пределах индекса с столбца БД и дергаешь по этому рандомному индексу нужные данные. Глянь скрин который я когда-то выкладывал в теме, должно быть понятно


Вот сама таблица с БД
Я это всё понимаю, но как мне понять есть ли в базе вообще с чем работать? Есть ли сессии в базе! По этому я и получал количество строк, я понимаю что это не правильно!
Док сказал как можно сделать, я так и поступил, всё упереться в то как вообще понять есть ли в базе строки с сессиями!
 

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113
Он должен ждать появление сессии если её нет.
У тебя сейчас шаблон ориентируется на то, какое количество строк вернул селект. Переориентируй его на селект после апдейта
 

yriy158

Client
Регистрация
10.08.2013
Сообщения
491
Благодарностей
301
Баллы
63
Он должен ждать появление сессии если её нет.
ну блин, может я не понял, но можно же делать проверку на пустую/не пустую переменную. Пустая - шаб ждет и чекает с определенным интервалом, не пустая - работает.
 
  • Спасибо
Реакции: doc

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8
У тебя сейчас шаблон ориентируется на то, какое количество строк вернул селект. Переориентируй его на селект после апдейта
Не совсем понял что ты имеешь в виду "Переориентируй его на селект после апдейта",
Вот основные блоки: http://prntscr.com/k5pkfv
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 598
Баллы
113

Martin Rigs

Client
Регистрация
22.06.2018
Сообщения
53
Благодарностей
1
Баллы
8

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)