2 место Заготовка для работы с БД MySQL в кубике C#

Регистрация
12.07.2014
Сообщения
916
Благодарностей
373
Баллы
63
1) посмотреть в конфиге mysql сколько вообще одновременных подключений разрешено - параметр max_connections
2) выставить в конфеге mysql достаточный wait_timeout - возможно сервер банально разрывает соединение из-за того что нет активности
3) дописать в методы getOne, getRow, getAll, query проверку на валидность соединения перед их выполнением и если не валидно - опять делать open

примерно так
C#:
if ( conn.State != ConnectionState.Open ){
    open();
}
Я в спойлере выше приложил весь конфиг mysql
# Connection Settings

max_connections = 120
max_connect_errors = 32
back_log = 512
thread_cache_size = 8
interactive_timeout = 180
wait_timeout = 180
С прописыванием методов беда))
 

Ikigai

Client
Регистрация
13.12.2016
Сообщения
276
Благодарностей
27
Баллы
28
Надеюсь данная заготовка кому-нибудь пригодится и поможет начать работать с MySQL т.к это открывает вам совершенно иные возможности при создании ваших шаблонов!
Иные возможности это конечно хорошо, но есть пробел в самых озах . Как установить ( нужно ли ставить на опен сервер ) , подключение и тд )
 
Регистрация
12.07.2014
Сообщения
916
Благодарностей
373
Баллы
63
Иные возможности это конечно хорошо, но есть пробел в самых озах . Как установить ( нужно ли ставить на опен сервер ) , подключение и тд )
Тут надо исходить из ваших потребностей.
Ищите инфу по форуму через ПС см. подпись )) "Озы" тут есть :D
 
Регистрация
12.07.2014
Сообщения
916
Благодарностей
373
Баллы
63
1) посмотреть в конфиге mysql сколько вообще одновременных подключений разрешено - параметр max_connections
2) выставить в конфеге mysql достаточный wait_timeout - возможно сервер банально разрывает соединение из-за того что нет активности
3) дописать в методы getOne, getRow, getAll, query проверку на валидность соединения перед их выполнением и если не валидно - опять делать open

примерно так
C#:
if ( conn.State != ConnectionState.Open ){
    open();  
}
Нашел в чем был косяк.
Обратил внимание что тем далее обрабатывается БД (а уже до 2 млн. записи дошло), то процесс mysql все более процессор загружает и обработка медленнее идет.
Начал копать и вычитал. Попробовал сделать совмещенный индекс для двух полей по которым отбирается строка. И прям полетело o_O :D
ЗА 2 суток миллион пролетел, а до этого 2,2 млн. за 20 дней :dl:;-):D:D:D
 
  • Спасибо
Реакции: Rimen

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
Для большего понимая добавил в стартпост еще один демонстрационный файл ( primer1.xmlz ) в котором уже реализована прямо конкретная готовая логика по взятию в работу аккаунтов из таблицы БД в многопотоке. То есть там даже думать не нужно, просто создайте таблицу нужной структуры (приведена ниже) и подставьте свои данные для коннекта к БД. Ну и таблицу аккаунтами не забудьте наполнить =);-)

Структура таблицы аккаунтов для этого примера такая:

Посмотреть вложение 41698
В базу кириллица приходит в виде ?????. В таблице кодировка utf8_general_ci, в шаблоне utf8. Извините в чем ошибка?
 

dtk77

Client
Регистрация
26.07.2017
Сообщения
24
Благодарностей
4
Баллы
3
В базу кириллица приходит в виде ?????. В таблице кодировка utf8_general_ci, в шаблоне utf8. Извините в чем ошибка?
Разобрался. В общем коде в строке подключения к db
var connectionString = "server="+db_hostname+";user="+db_username+";database="+db_database+";port="+db_port+";password="+db_password+";pooling=False"; отсутствует characterset=utf8, хотя в аргументах параметр utf8 передается.
 
  • Спасибо
Реакции: MaxMan и bigloafer

qwadra

Client
Регистрация
21.11.2017
Сообщения
264
Благодарностей
42
Баллы
28
В чем ошибка? ; вроде, хватает

2020-06-05_20-56-23.png
 

Philipp

Client
Регистрация
14.10.2019
Сообщения
100
Благодарностей
55
Баллы
28
Не пойму в чём дело, выдаёт такую ошибку, из кубика подключается к базе без проблем. Файл закинул из progs, может нужно ещё что-то сделать с директивами?

Компиляция кода Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "DB" (пропущена директива using или ссылка на сборку?)". [Строка: 6; Cтолбец: 13]
 
Регистрация
12.07.2014
Сообщения
916
Благодарностей
373
Баллы
63
Не пойму в чём дело, выдаёт такую ошибку, из кубика подключается к базе без проблем. Файл закинул из progs, может нужно ещё что-то сделать с директивами?

Компиляция кода Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "DB" (пропущена директива using или ссылка на сборку?)". [Строка: 6; Cтолбец: 13]
В общий код надо добавить как ни странно код)))
Его можно взять из шаблона примера
 

iskrakovrov

Client
Регистрация
28.03.2015
Сообщения
532
Благодарностей
171
Баллы
43

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с iskrakovrov какие-либо сделки.

-решено-
 
Последнее редактирование:

Philipp

Client
Регистрация
14.10.2019
Сообщения
100
Благодарностей
55
Баллы
28
Не пойму в чём дело, выдаёт такую ошибку, из кубика подключается к базе без проблем. Файл закинул из progs, может нужно ещё что-то сделать с директивами?

Компиляция кода Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "DB" (пропущена директива using или ссылка на сборку?)". [Строка: 6; Cтолбец: 13]
Тут проблема была в подключаемомо порте, изменил в общем коде на свой порт и подключение заработало.

Но теперь другая проблема, как бы я не пытался составить запрос, у меня получается взять строку селектом из контекста, но сделать Update не получается, в менеджере БД этот запрос выполняется без проблем, а через зенку вот что выдаёт.
C#:
var db = project.Context["db"];
db.query("UPDATE accounts SET process=1 WHERE id=10");
Ошибка:


Выполнение действия CSharp OwnCode: взять аккаунт. Unknown column 'process' in 'field list'

Я так понимаю что-то с синтаксисом, перепробовал все кавычки но не заработало.
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
@Philipp

1) В коде указан порт по умолчанию который подходит для 99.999% случаев ... если нужно изменить, то можно указать хост с нужным портом, например: localhost:1234 ( где 1234 - порт для подключения )
2) Ошибка от апдейта говорит вам что у вас в таблице accounts нет столбца process ( возможно в названии столбца и запросе они написаны по-разному из-за опечатки, проверяйте побуквенно )
 
  • Спасибо
Реакции: Philipp

temass

Client
Регистрация
06.06.2015
Сообщения
98
Благодарностей
3
Баллы
8
.
 

iskrakovrov

Client
Регистрация
28.03.2015
Сообщения
532
Благодарностей
171
Баллы
43

Обращаем Ваше внимание на то, что данный пользователь заблокирован.
Не рекомендуем проводить с iskrakovrov какие-либо сделки.

А как в си# вставить переменные из проекта. Например вот в данную строку? Сам синтаксис. Если переменная не число, а текст например. Разговор не про правильность запроса а именно про синтаксис
db.query("UPDATE accounts SET process=переменная 1 из проекта WHERE id=переменная 2 из проекта");


Заранее спасибо
 

Philipp

Client
Регистрация
14.10.2019
Сообщения
100
Благодарностей
55
Баллы
28
@Philipp

1) В коде указан порт по умолчанию который подходит для 99.999% случаев ... если нужно изменить, то можно указать хост с нужным портом, например: localhost:1234 ( где 1234 - порт для подключения )
2) Ошибка от апдейта говорит вам что у вас в таблице accounts нет столбца process ( возможно в названии столбца и запросе они написаны по-разному из-за опечатки, проверяйте побуквенно )
Не знаю как, но сегодня при прочих равных всё сработало, может потому что перегрузил локальную базу
Спасибо
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Заранее спасибо
C#:
db.query("UPDATE accounts SET process=" + project.Variables["proc"].Value + " WHERE id=" + project.Variables["id"].Value);
// Если используешь в запросах одинарные кавычки:
db.query("UPDATE accounts SET process='" + project.Variables["proc"].Value + "' WHERE id='" + project.Variables["id"].Value + "'");
 
  • Спасибо
Реакции: Zippy и iskrakovrov

lockerr

Client
Регистрация
20.08.2019
Сообщения
36
Благодарностей
10
Баллы
8
@WebBot Привет!

На 7.2.1 еще не столкнулись с этим? Есть идеи как лечить?


C#:
Выполнение действия CSharp OwnCode: Choose DB (Prod \ Test). [Общий код: Строка: 778; Cтолбец: 2] Не удалось загрузить файл или сборку "MySql.Data, Version=6.9.6.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Найденное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
UPD: решено. Удалил "свою" библиотеку в т.ч. из GAC. Подоткнул "родную" из папки Progs там же в GAC - все завелось
 
Последнее редактирование:

TheBoss

Client
Регистрация
30.03.2015
Сообщения
529
Благодарностей
194
Баллы
43

vesb

Client
Регистрация
13.03.2010
Сообщения
139
Благодарностей
18
Баллы
18
Подскажите, я правильно понимаю, что если только добавляешь строки в БД в многопотоке, то нет смысла локать бд?
 

kfil

Client
Регистрация
09.09.2016
Сообщения
18
Благодарностей
16
Баллы
3
@WebBot Привет!

На 7.2.1 еще не столкнулись с этим? Есть идеи как лечить?


C#:
Выполнение действия CSharp OwnCode: Choose DB (Prod \ Test). [Общий код: Строка: 778; Cтолбец: 2] Не удалось загрузить файл или сборку "MySql.Data, Version=6.9.6.0, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Найденное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
UPD: решено. Удалил "свою" библиотеку в т.ч. из GAC. Подоткнул "родную" из папки Progs там же в GAC - все завелось
у меня получилось решить данную проблему следующим образом: просто заменил новую сборку той которую требует т.е. версией 6.9.6.0 в папке Progs после этого всё заработало без изменения шаблона.
 

Putn1k

Client
Регистрация
03.01.2020
Сообщения
67
Благодарностей
19
Баллы
8
Ребят, подскажите, пожалуйста. Что именно в общий код нужно добавить и куда, чтобы если оборвалась связь, он не выдавал ошибку при попытке соединиться с базой, а делал новое подключение и выполнял запрос? Буду очень благодарен за помощь, а то уже задолбался, не могу никак найти.

Автору большое спасибо за статью!
 

bekas

Client
Регистрация
08.04.2011
Сообщения
93
Благодарностей
6
Баллы
8
Вопрос покажется нубским, но все же: если мы лочим таблицу на запись, то в это время второй поток, который также пытается внести изменения в эту таблицу, получит ошибку при выполнении запроса или будет ждать?
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Вопрос покажется нубским, но все же: если мы лочим таблицу на запись, то в это время второй поток, который также пытается внести изменения в эту таблицу, получит ошибку при выполнении запроса или будет ждать?
Встанет в очередь, т.е. будет ждать.
 
  • Спасибо
Реакции: Zippy и bekas

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
  • Спасибо
Реакции: bekas

pavel1977

Client
Регистрация
05.02.2018
Сообщения
2
Благодарностей
0
Баллы
1
Автору большое спасибо! Очень удобно подключится к базе и работать с ней.

Подскажите пожалста - пробую взять размер базы и положить в переменную:

db.query("SELECT table_schema AS 'DB Name', sum( data_length + index_length ) / 1024 / 1024 AS 'Data Base Size in MB' FROM information_schema.tables WHERE table_schema = '" + project.Variables["db_database"].Value + "' GROUP BY table_schema;");

в переменную приходит только - ok

Заранее спасибо ;-)
 

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
Ребят а подскажите такой момент, когда происходит запрос к БД (на хостинге) от шаблона, сам запрос если отснифать на компе где шаблон, возможно ли вытянуть данные которые передаются?
 
Регистрация
03.12.2020
Сообщения
146
Благодарностей
103
Баллы
43
Ребят а подскажите такой момент, когда происходит запрос к БД (на хостинге) от шаблона, сам запрос если отснифать на компе где шаблон, возможно ли вытянуть данные которые передаются?
Конечно. Без проблем.
 

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
Регистрация
03.12.2020
Сообщения
146
Благодарностей
103
Баллы
43
Это врядли. Разве что получится работать как под линуксом, не через IP, а через стековый-файл.
 

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