ssXXXss
Client
- Регистрация
- 23.12.2014
- Сообщения
- 7 379
- Благодарностей
- 2 041
- Баллы
- 113
она есть в паке зенкиА где почитать с примерами как работать с этой самоу либой и как она вообще называется то? Секретная не? )
она есть в паке зенкиА где почитать с примерами как работать с этой самоу либой и как она вообще называется то? Секретная не? )
Очень.А где почитать с примерами как работать с этой самоу либой и как она вообще называется то? Секретная не? )
А откуда могут быть глюки в 2х простейших запросах? )не замечал глюки, на гетах и в 500 потоков
На самом деле не вижу смысла. Как уже отвечал тебе - большинству это не нужно, а кому нужно - тот либо сам напишет, либо готовую орм возьмет. Тем более это по факту даже не орм, а небольшая обертка для массового загона json данных в мускул + немного методов для удобства использования. Если кому-то прямо сильно интересно - пишите, дам доступ к проекту на гитлабе.Может быть пора народу увидеть дбхелпер? Или хотя бы тем, кто сможет помочь в его доработке - выдать доступы? Думаю, @Karamzin приятно удивился бы уменьшению количества строк кода)
Будет работать само собой, лучше базу тогда innodb делать, что бы локов не ждать...Здравствуйте. Вот если у меня два шаблона. Первый собирает данные в таблицу, а второй берет данные из этой таблицы. При блокировке таблицы эти шаблоны не будут перекрывать друг друга? Я так понял эта блокировка происходит как бы в самой базе данных и в таком режиме потоки смогут существовать. Или нет?
Спасибо за ответ! Столкнулся еще с одной проблемой: У меня есть две таблицы: Users и Users_del. Таблица Users_del выступает в роли черного списка, то есть, мне нужно взять первую строку из списка Users, удалить её и проверить есть ли такая строка в списке Users_del. Если такая строка есть, то берем следующую строку из списка Users. Повторяем это до тех пор, пока не возьмем строку, которой нет в черном списке. Я написал код для этого:Будет работать само собой, лучше базу тогда innodb делать, что бы локов не ждать...
Sql sqlConn = new Sql(project);
var cmd = sqlConn.Cmd();
cmd.Connection.Open();//открываем сессию
cmd.DbLock("Users WRITE, Users_del WRITE");//блокирую таблицу
object count = cmd.ExScalar("SELECT COUNT(*) FROM `Users`");
if(int.Parse(count.ToString())==0)
{
cmd.DbUnLock();//разблокировка всех таблиц
cmd.Connection.Close(); //закрываем сессию
return "STOP"; //Если таблица пустая, то завршаю выполнение
}
do
{
object user = cmd.ExScalar(@"SELECT `Users` FROM `Users` LIMIT 1"); //беру user
cmd.ExNonQ("DELETE FROM Users LIMIT 1;"); //удаляю строку юзеры
count = cmd.ExScalar("SELECT COUNT(*) FROM `Users`"); //обновляю count
object del = cmd.ExScalar(@"SELECT Users_del FROM Users_del WHERE Users_del = "+user.ToString()+@";"); //проверяю наличия стоки в черном списке
if(del!=null) continue; //если есть строка в чс, то берем следующую строку;
cmd.DbUnLock();//разблокировка всех таблиц
cmd.Connection.Close(); //закрываем сессию
return Regex.Replace(user.ToString(),@"\W",""); //вывожу строку в переменную проекта
} while(int.Parse(count.ToString())>0);
if(int.Parse(count.ToString())==0)
{
cmd.DbUnLock();//разблокировка всех таблиц
cmd.Connection.Close(); //закрываем сессию
return "STOP"; //Если строки закончились после проверок на чс
}
Перед добавлением строки в Users можно сделать запрос на удаление всех юзеров из Users, которые есть в Users_del.У меня есть две таблицы: Users и Users_del. Таблица Users_del выступает в роли черного списка, то есть, мне нужно взять первую строку из списка Users, удалить её и проверить есть ли такая строка в списке Users_del. Если такая строка есть, то берем следующую строку из списка Users. Повторяем это до тех пор, пока не возьмем строку, которой нет в черном списке. Я написал код для этого:
DELETE FROM Users WHERE Users in (SELECT Users_del FROM Users_del WHERE 1);
У тебя долго выполняются процессы. В результате по таймауту отваливаются соединения.Этот код адекватно работает в малопоточном режиме. Как только я наращиваю потоки хотя бы до 30, то ловлю ошибку: "Выполнение действия CSharp OwnCode Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding." В чем может быть проблема? Могу предположить, что мой код слишком перегружен и в нем есть какие-то нелогичные моменты. Сильно не ругайтесь, я до недавнего времени работал только со списками и пытаюсь применить какую-то "списочную" логику к базе данных. Возможно в этом и заключается ошибка. Буду очень благодарен за помощь!
ну ты сначала прочти и вдумайся в то, о чем я у него спросил в моем последнем сообщении.....человек тебе даже ситрелками указал
Автор показал мне как увеличить таймаут, за что ему спасибо, частично это решит проблему. Далее он указал на то, что моя логика в принципе не верна. Я решил задать ему вопрос по этому поводу (хотя я и изначально это предполагал). Ответит он или нет - это уже его дело. Мне всегда казалось, что в этом и есть смысл этого форума. У тебя лично я ничего не спрашивалещё скажи что ты слепой и без рукий )
Может быть и так) таблицы там самые простейшие. В том то и дело, что я даже не понимаю в какую сторону думать и где черпать инфу. Я как привык работать со списками, так и тут пытаюсьу него mysqk у тебя sql может тут логика скорости ?
не думаю что у тебя там работа с вложеными талицами
ну тут тебе только известно как построен шаблон, что он там делает, как, где то значит в шабе затык если всё просто и тормозМожет быть и так) таблицы там самые простейшие. В том то и дело, что я даже не понимаю в какую сторону думать и где черпать инфу. Я как привык работать со списками, так и тут пытаюсь
В БД обычно удаление строк вообще не практикуется.Совсем другую это какую?) Ну хотя бы в какую сторону думать
DateTime recheck_date = DateTime.UtcNow + new TimeSpan(0, 2, 0, 0);
var i = cmd.ExNonQ(@"UPDATE payout SET recheck_date='{0}' WHERE id={1};".f(recheck_date.ToString("yyyy-MM-dd HH:mm:ss"), pay[0]));
(в данном примере у меня вместо string.format сделано расширение .f())
DateTime date = DateTime.UtcNow;
var reader = cmd.ExReader(@"SELECT * FROM payout WHERE STATUS='request' AND (recheck_date<'{0}' OR recheck_date IS NULL) LIMIT 1;".f(date.ToString("yyyy-MM-dd HH:mm:ss")));
В БД обычно удаление строк вообще не практикуется.
Ты с таблицами работаешь как со списками. Надо перестраиваться. Иначе смысла ни какого.
Принцип следующий:
У тебя должна быть одна таблица в которой есть дополнительная колонка status. И этот статус ты меняешь при необходимости. В твоем случае на del. И когда вытаскиваешь строку из таблицы указываешь что строка должна быть с колонкой status отличной от 'del'.
Если аккаунт в работе, то можешь присвоить статус например 'busy' или 'work'. Если закончил работу с ним, то меняй на 'done' 'complete'. Если нужно удалить, то на 'del'. Если акк забанен, то 'ban' и т.д.
Если нужно периодически перепроверять аккаунты раз в 2 часа, то добавляй колонку date и ставь туда время сейчас + 2 часа. Типа:
а запрос на "не пора ли нам проверить":PHP:DateTime recheck_date = DateTime.UtcNow + new TimeSpan(0, 2, 0, 0); var i = cmd.ExNonQ(@"UPDATE payout SET recheck_date='{0}' WHERE id={1};".f(recheck_date.ToString("yyyy-MM-dd HH:mm:ss"), pay[0])); (в данном примере у меня вместо string.format сделано расширение .f())
т.е. ищет запись с датой более ранней чем "сейчас"PHP:DateTime date = DateTime.UtcNow; var reader = cmd.ExReader(@"SELECT * FROM payout WHERE STATUS='request' AND (recheck_date<'{0}' OR recheck_date IS NULL) LIMIT 1;".f(date.ToString("yyyy-MM-dd HH:mm:ss")));
Вот спасибо вроде суть уловил, попробую применитьну вообще так не используй SELECT * FROM не ищи по всем таблицам если знаешь конктректно в чём ищешь
Размер базы какой?Вот спасибо вроде суть уловил, попробую применить
Индекс это id? Если да, то есть, если нет, то перед тем как это писать не гуглил даже. Немного освобожусь, вникну более детально и попробую применить все рекомендацииРазмер базы какой?
Индексы есть (ооооооочень сильно ускоряет)?
По хорошему надо делать left join с таблицей которая в бане, а к стате если в бане вы выясняете по ходу пьесы - вам верно сказали проще поле (статус) добавить что был бан и апдейт делать...
Размер основной таблицы около 5000000 строк, а в черном списке примерно 200000Размер базы какой?
ищи в гугле индексирование таблиц mysqlИндекс это id? Если да, то есть, если нет, то перед тем как это писать не гуглил даже. Немного освобожусь, вникну более детально и попробую применить все рекомендации
id само собой примари индекс у тебя должен быть... после бана/удаления и других смен статусов по этому id и нужен апдейтИндекс это id?
На поле статус тоже нужен index - тогда условно если ты будешь делать select * from users where status='active' limit 1; у тебя выборка пойдёт только по "живим" узерам, а не по всем подряд... - значительно ускорит процесс5000000
Тоже переношу все в бд.Грубо индексы нужны на те поля по которым ты делаешь выборки/сортировки т.е. то что ты пишешь после where или ордер бай
Навредит. Из-за индексов увеличивается время вставки/удаления из таблицы. Чем больше индексов - тем дольше будет вставлять новую строчку (т.к. обрабатывает индекс каждую вставку).И не навредит ли большое количество индексов в каждой таблице?