Отправка запросов в БД
Всем добрый день. Сейчас отправляю запросы в mysql таким образом:
let x = 0; setInterval(function(){ connection.query("SELECT * FROM person WHERE x = '"+x+"' ... ", function() { x++; }); },500); Из этого видно что setInterval абсолютно не видит когда приходит обратный ответ с БД. Время пол секунды, установлено приблизительно, т.к. я уверен чтоб БД уже завершила ответ. Как сделать чтобы после ответа сразу отправлялся след запрос? Существует какой-либо шаблон, по которому все пишут, а я вот его не знаю? |
Зачем так бд сношать?
|
события в бд поступают в реальном времени, строка за строкой. и нужно обрабатывать эти строки понемногу, вот и пытаюсь придумать цикл для обработки.
|
jtag, что значит "события поступают в бд"?
|
события т.е. новые строки
|
Цитата:
|
jtag, что мешает уже обработанным строкам добавлять флаг (либо хранить где-нибудь последний обработанный id) и запрашивать у бд сразу некоторое кол-во записей, которые нужно обработать?
Зачем каждые пол секунды долбить бд новым запросом? Быстрее она от этого работать не станет. |
Незнаю можно ли тут обсуждать БД, но вот что у меня получается. Вначала я делаю выборку одним разом всех не обработанных строк. Потом в цикле начинаю обрабатывать каждую строку, т.е. делаю запрос в БД, существует ли такой ИИН, если нет такого, то вставляю в базу. Потом вставляю телефон, и делаю запрос - отмечаю необработанную строку флагом "обрабатано". Получается, мне нужно все используемые таблицы скопировать и потом с ними в обычном цикле for производить операции?
let x = 0; con.query("SELECT * FROM xml_person WHERE done='0'", function (err, resultFromXml) { //запрос всех необработанных строк setInterval(function () { con.query("SELECT * FROM person WHERE iin='" + resultFromXml[x].iin + "'", function (err, resultFromPerson) { //проверка, имеется ли такой ИИН в базе if (resultFromPerson.length == 0) { con.query("INSERT INTO `person` (`idperson`, `iin`, `surname`, `name`,..., function(err) { //вставка person con.query("INSERT INTO `phone` (`id`, `phone`," ... function(err) { //вставка телефона con.query("UPDATE xml_person SET done='4' WHERE id_xml_person='" + resultFromXml[x].id_xml_person, function(err) { //ставлю флаг, что строка обработана x++; } } }); } }); }, 500); } |
jtag,
я не знаю node.js, но как можно обрабатывать результат запроса не зная, что он вернул? А если запрос завершился неудачей? |
я просто сократил и вырезал, а так там конечно, ошибки обрабатываются.
|
jtag, что мешает реализовать такой алгоритм:
Получаю список данных на обработку; Собираю все айдишники пользователей в массив; Запрашиваю из бд поля id и ИНН пользователей, чей id лежит в собранном массиве; Создаю объект "insert", в который буду складывать данные для вставки в бд; В цикле гоняю полученные данные заполняя объект "insert"; Если "insert" не пустой, создаю в бд сразу несколько записей на основе данных из этого объекта. Описанный мною алгоритм требует всего 3 запроса и 1 цикл. |
Nexus,
по уму, так тут никаких циклов и требуется, собственно как и четыре запроса. |
laimas, "insert select"?
|
Спасибо. Попробую реализовать.
|
Цитата:
let x = 0; function query(){ connection.query("SELECT * FROM person WHERE x = '"+x+"' ... ", function() { x++; setTimeout(query,500); }); } query(); |
jtag, если у вас все необходимые данные есть в бд, то можно обойтись 1 запросом к бд.
Без циклов и прочего. |
Цитата:
Я не знаю node и для меня в запросах setTimeout(), это вообще какая-то дикость. :) Но то что запросы организованы не как полагается, это видно сразу. |
laimas, я тоже ноду не знаю, но автору, вроде как нужно добавить пользователей, для которых в бд нет инн.
|
NeoN, я node.js не знаю, но не оцените ли саму идею этого кода? :)
class SomeClass{ /** * @return Promise */ public getFirstOneBillionUsers(){ return new Promise(function(resolve){ var counter=0, users=[], request=function(){ connection.query('SELECT * FROM users WHERE id>'+$counter+' LIMIT 1',function(user){ counter++; users.push(user); if(counter<Math.pow(10,9)) setTimeout(request,500); else resolve(users); }); }; }); } }По-моему гениальный способ зад-чить бд :) Примерное время выполнения метода: чуть меньше 16 лет. |
процедуру напиши
|
Цитата:
Собрать перед запросом нечто чем потом оперировать дабы исключить циклы, это желательно, но что это, откуда взялось не знаю, а посему сказать трудно. |
Часовой пояс GMT +3, время: 20:21. |