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

  • Автор темы Автор темы WebBot
  • Дата начала Дата начала
  • Теги Теги
    mysql
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

С прописыванием методов беда))
 
Надеюсь данная заготовка кому-нибудь пригодится и поможет начать работать с MySQL т.к это открывает вам совершенно иные возможности при создании ваших шаблонов!
Иные возможности это конечно хорошо, но есть пробел в самых озах . Как установить ( нужно ли ставить на опен сервер ) , подключение и тд )
 
Иные возможности это конечно хорошо, но есть пробел в самых озах . Как установить ( нужно ли ставить на опен сервер ) , подключение и тд )
Тут надо исходить из ваших потребностей.
Ищите инфу по форуму через ПС см. подпись )) "Озы" тут есть :D
 
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
Для большего понимая добавил в стартпост еще один демонстрационный файл ( primer1.xmlz ) в котором уже реализована прямо конкретная готовая логика по взятию в работу аккаунтов из таблицы БД в многопотоке. То есть там даже думать не нужно, просто создайте таблицу нужной структуры (приведена ниже) и подставьте свои данные для коннекта к БД. Ну и таблицу аккаунтами не забудьте наполнить =);-)

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

Посмотреть вложение 41698

В базу кириллица приходит в виде ?????. В таблице кодировка utf8_general_ci, в шаблоне utf8. Извините в чем ошибка?
 
В базу кириллица приходит в виде ?????. В таблице кодировка 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 передается.
 
  • Спасибо
Реакции: orka13, MaxMan и bigloafer
В чем ошибка? ; вроде, хватает

2020-06-05_20-56-23.png
 
Не пойму в чём дело, выдаёт такую ошибку, из кубика подключается к базе без проблем. Файл закинул из progs, может нужно ещё что-то сделать с директивами?

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

Компиляция кода Ошибка в действии "CS0246" "Не удалось найти имя типа или пространства имен "DB" (пропущена директива using или ссылка на сборку?)". [Строка: 6; Cтолбец: 13]
В общий код надо добавить как ни странно код)))
Его можно взять из шаблона примера
 
Не пойму в чём дело, выдаёт такую ошибку, из кубика подключается к базе без проблем. Файл закинул из 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'

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

1) В коде указан порт по умолчанию который подходит для 99.999% случаев ... если нужно изменить, то можно указать хост с нужным портом, например: localhost:1234 ( где 1234 - порт для подключения )
2) Ошибка от апдейта говорит вам что у вас в таблице accounts нет столбца process ( возможно в названии столбца и запросе они написаны по-разному из-за опечатки, проверяйте побуквенно )
 
  • Спасибо
Реакции: Philipp
.
 
А как в си# вставить переменные из проекта. Например вот в данную строку? Сам синтаксис. Если переменная не число, а текст например. Разговор не про правильность запроса а именно про синтаксис
db.query("UPDATE accounts SET process=переменная 1 из проекта WHERE id=переменная 2 из проекта");


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

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

Не знаю как, но сегодня при прочих равных всё сработало, может потому что перегрузил локальную базу
Спасибо
 
Заранее спасибо
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
@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 - все завелось
 
Последнее редактирование:
Подскажите, я правильно понимаю, что если только добавляешь строки в БД в многопотоке, то нет смысла локать бд?
 
@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 после этого всё заработало без изменения шаблона.
 
Ребят, подскажите, пожалуйста. Что именно в общий код нужно добавить и куда, чтобы если оборвалась связь, он не выдавал ошибку при попытке соединиться с базой, а делал новое подключение и выполнял запрос? Буду очень благодарен за помощь, а то уже задолбался, не могу никак найти.

Автору большое спасибо за статью!
 
Вопрос покажется нубским, но все же: если мы лочим таблицу на запись, то в это время второй поток, который также пытается внести изменения в эту таблицу, получит ошибку при выполнении запроса или будет ждать?
 
Вопрос покажется нубским, но все же: если мы лочим таблицу на запись, то в это время второй поток, который также пытается внести изменения в эту таблицу, получит ошибку при выполнении запроса или будет ждать?
Встанет в очередь, т.е. будет ждать.
 
  • Спасибо
Реакции: Zippy и bekas
Автору большое спасибо! Очень удобно подключится к базе и работать с ней.

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

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

Заранее спасибо ;)
 
Ребят а подскажите такой момент, когда происходит запрос к БД (на хостинге) от шаблона, сам запрос если отснифать на компе где шаблон, возможно ли вытянуть данные которые передаются?
 
Ребят а подскажите такой момент, когда происходит запрос к БД (на хостинге) от шаблона, сам запрос если отснифать на компе где шаблон, возможно ли вытянуть данные которые передаются?
Конечно. Без проблем.
 
Это врядли. Разве что получится работать как под линуксом, не через IP, а через стековый-файл.
 

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