Mod Подключаем MySql

Дата рег
19 Фев 2011
Сообщения
196
Симпатии
71
Гугли std::thread и аналоги. Пили менеджмент своих сообщений.

Я с sql не работал, но будет что-то вроде:
Код:
#include "thread"
#include "mutex"
 
vector<reqest> ReadyReq; // Обработанные
mutex ReadyReq_mut;
 
vector<reqest> WaitReq;  // Ожидающие обработки
mutex WaitReq_mut;
 
bool	ExitThread;
mutex ExitThread_mut;
 
void SqlThread( )
{
	BD* Bd = CreateBD();
	bool isContinue = true;
	while( isContinue )
	{
		 ExitThread_mut.lock();
		 isContinue = !ExitThread;
		 ExitThread_mut.unlock();
		 if( !isContinue )
			break;
		reqest* req = NULL;
		WaitReq_mut.lock();
		req = WaitReq.At(0);
		if( req )
			WaitReq.erase( 0 );
		WaitReq_mut.unlock();
 
		if( !req )
			std::this_thread::sleep_for(1s);
		else
		{
			Bd.check( reqest );
	  
			ReadyReq_mut.lock();
			ReadyReq.push_back( reqest );
			ReadyReq_mut.unlock();
		}
	}
	// Чистим все
	ReleaseBD( bd );
}
 
void AddReqestBD( reqest* req  )
{
	 WaitReq_mut.lock();
	 WaitReq.push_back( reqest );
	 WaitReq_mut.unlock();
}
 
reqest* CheckReqest(  )
{ 
	  reqest* req = NULL;
	 ReadyReq_mut.lock();
	  // Ищем нужный, записываем его в реквест, удаляем с вектора обработанных.
	 ReadyReq_mut.unlock();
	return req;
)
 
void StartBDThread( )
{
	 thread myThread(SqlThread);
}
Собственно на финише нужно убивать этот процесс, через ExitThread, лучше заджойниться с ним после установки переменной, и дождаться пока он закочит работу.
 
Дата рег
2 Июн 2013
Сообщения
62
Симпатии
17
В общем, такая шляпа - после отправления запроса к БД сервер ждёт от неё ответа. Следовательно если БД обрабатывает много данных - сервер всё это время висит, что довольно ощутимо при больших объёмах. Можно как-то выпилить ожидание ответа? Отправил и забыл, а что там с ним БД будет делать, дело десятое.
Можно делать временные таблицы с ENGINE MEMORY, откуда потом выгребать все в нужные таблицы в InnoDB любым обработчиком. Можно писать все в обычные файлы, из которых потом неспеша делать
Код:
LOAD DATA INFILE 'data.txt' INTO TABLE table;
в нужные таблицы.

В ситуации, когда дисковый массив сервера зачастую работает "на бобинах", и данные пачками инсертятся в MySQL myisam/innodb, то при большом количестве данных в таблицах и большом количестве одновременных операций все может завалиться. Это будет вдвойне невесело, если MySQL расположен на том же сервере, где работает фолач, потому что задержки в работе дисковой системы при нагрузках могут блокировать много CPU.

Можно использовать какой-нибудь Redis как временное высокопроизводительное хранилище для временных данных, а потом выгребать и обрабатывать их в MySQL, расположенном на другом сервере, любым удобным способом с помощью воркера.
 
Дата рег
17 Сен 2014
Сообщения
132
Симпатии
18
В общем, подогнал cpp как мне надо, но теперь не могу его скомпилировать. Точнее, после танцев с бубном, выяснилось, что скомпилировать может только VS2010, но с получившейся дллкой сервер не стартует в принципе, и валится с дампом. Можно попросить подробную инструкцию как и чем это компилировать?

Код:
#include "fonline_tla.h"
 
#include "Windows.h"
 
#include "mysql.h"
 
#pragma comment (lib, "libmysql.lib")
 
// Extern data definition
 
_GlobalVars GlobalVars;
 
// Entry point
 
FONLINE_DLL_ENTRY( isCompiler )
 
{
 
if( isCompiler )
 
return;
 
// Test Memory Level 3 for loaded DLLs
 
for( uint i = 0; i < 666; i++ )
 
volatile char* leak = new char[ 2 ];
 
}
 
EXPORT int SqlQueryti(ScriptString& ServerIp ,int port ,ScriptString& name,ScriptString& pass, ScriptString& BdName, ScriptString& query, ScriptString& result)
 
{
 
MYSQL *conn;
 
MYSQL_RES *res;
 
MYSQL_ROW row;
 
int i = 0;
 
bool IsConected = false;
 
 
 
// Получаем дескриптор соединения
 
conn = mysql_init(NULL);
 
result = "";
 
if(conn == NULL)
 
{
 
// Если дескриптор не получен – выводим сообщение об ошибке
 
result = "Error: can't create MySQL-descriptor \n";
 
return 1;
 
}
 
// Подключаемся к серверу
 
if(!mysql_real_connect(conn, ServerIp.c_str(), name.c_str(), pass.c_str(), BdName.c_str(), port, NULL, 0))
 
{
 
// Если нет возможности установить соединение с сервером
 
// базы данных выводим сообщение об ошибке
 
result = "Error: can't connect to database \n";
 
return 2;
 
}
 
else
 
{
 
// Если соединение успешно установлено
 
IsConected = true;
 
mysql_set_character_set(conn, "cp1251"); //изменяем кодировку на нужную, по умалчанию идёт latin1
 
 
 
}
 
 
 
string tempSrt ="";
 
if(IsConected)
 
{
 
mysql_query(conn, query.c_str()); //Делаем запрос
 
return 0;
 
}
 
return 0;
 
}
 
Дата рег
17 Сен 2014
Сообщения
132
Симпатии
18
Буду признателен, если кто-то сможет скомпилировать. Бьюсь вторую неделю, но ничего не выходит. Даже оригинал не компилируется.
 
Дата рег
17 Сен 2014
Сообщения
132
Симпатии
18
В общем, перепробовав десятки различных комбинаций ПО, удалось таки скомпилироваться. Выкладываю примерный порядок действий, если кому понадобится.

1) Устанавливаем ПО:
Microsoft SDKs
mysql-5.1.40
Microsoft Visual Studio 10.0

Делаем полную установку, а не рекомендуемую.

2) На всякий пожарный копируем сборку сервера в отдельную папку.

3) Кладем MySqlСonnect.cpp в папку server/scripts.

4) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\include и копируем оттуда всё в server/scripts.

5) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\bin и копируем оттуда libmysql.dll в server/scripts.

6) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\lib\opt и копируем оттуда libmysql.lib в server/scripts, т.к. без него libmysql.dll не будет правильно открываться.

7) Открываем блокнот, создаем новый файл, копируем туда следующий код, после чего сохраняем как makeMySqlConnect.bat в server/scripts. Проверяем, чтобы все пути совпадали с теми, где у вас реально установлеон ПО.

Код:
@echo off
@: Environment
@set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE;%PATH%
@set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;%PATH%
@set LIB=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\LIB;%LIB%
@set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Lib;%LIB%
@set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%
@set LIB=.\StlPort;%LIB%
@set INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include;%INCLUDE%
@set INCLUDE=.\StlPort;%INCLUDE%
@set INCLUDE=C:\Program Files (x86)\Windows Kits\8.1\Include\shared;%INCLUDE%
@set INCLUDE=C:\Program Files (x86)\Windows Kits\8.0\Include\shared;%INCLUDE%
@set INCLUDE=C:\Program Files (x86)\Windows Kits\8.1\Include\um;%INCLUDE%
@set INCLUDE=C:\Program Files\MySQL\MySQL Server 5.1\include;%INCLUDE%
 
@set INCLUDE=C:\Program Files\MySQL\Connector.C++ 1.1\include\cppconn;%INCLUDE%
@set INCLUDE=C:\Program Files\MySQL\Connector.C++ 1.1\include;%INCLUDE%
 
@set LIB=C:\Program Files\MySQL\Connector.C++ 1.1\lib\opt;%LIB%
 
@set INCLUDE=C:\Program Files\MySQL\MySQL Connector.C 6.1\include;%INCLUDE%
 
@set LIB=C:\Program Files\MySQL\MySQL Connector.C 6.1\lib;%LIB%
 
@set INCLUDE=C:\Program Files\MySQL\MySQL Server 5.1\include;%INCLUDE%
 
@set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include;%INCLUDE%
 
@: Server
@del "./MySqlConnect.dll"
cl.exe /nologo /MT /W3 /O2 /Gd /D "__SERVER" /Fo"./MySqlConnect.obj" /FD /c "./MySqlConnect.cpp"
link.exe /nologo /dll /incremental:no /machine:I386 "./MySqlConnect.obj" /out:"./MySqlConnect.dll"
 
@pause
7) Запускаем makeMySqlConnect.bat в server/scripts. Если всё прошло удачно, в server/scripts появится MySqlConnect.dll.
 
Дата рег
17 Сен 2014
Сообщения
132
Симпатии
18
Библиотека не закрывает коннекты после передачи данных, что очень вредит производительности сервера.
 
Дата рег
22 Мар 2014
Сообщения
166
Симпатии
17
То что оно не закрывает, я же уже написал и как решить эту проблему тоже: Пост #24