ファイルを解析し、これらのファイルの内容に従って MySQL データベースを更新する C++ コードがあります。MySQL 5.7 を使用して Windows 10 でコードを実行し、ベースでは InnoDB エンジンを使用しています。MySQL の呼び出しは、libmysql の周りに独自のラッパーを介して実行されます。
このコードを最適化するために、バッファーの最大サイズに達するまで更新要求をバッファーに追加し、バッファー全体 (N 個の更新を含む) を同時に送信します。このプロセス全体が単一のトランザクション内で行われます。
私のコードは次のようになります。
MySQLWrapper.StartTransaction();
string QueryBuffer = "";
// Element count is the number of elements parsed from the files
for( int i = 0 ; i < ElementCount ; ++i )
{
bool FlushBuffer =
( i> 0 && ! (( i + 1 ) % N) ) ||
( i == ElementCount - 1 ); // determines if we have reached the buffer max number of requests
QueryBuffer += "INSERT INTO mytable (myfield) VALUES (" Element[ i ] ");";
if( FlushBuffer )
{
MySQLWrapper.SendRequest( QueryBuffer );
QueryBuffer.assign("");
}
}
MySQLWrapper.Commit();
SendRequest(string Request ) の実装は基本的に次のようになります。
void SendRequest(string Request)
{
mysql_query( SQLSocket, Request.c_str())
}
ただし、トランザクションをコミットするときに、トランザクションが壊れていることがあります。MySQL は、状態がコミットに対して正しくないことを示しています。私は同じことをしようとしましたが、リクエストを 1 つずつ送信しましたが、このエラーはコミットの時点では発生しません。
だから、私の2つの質問は次のとおりです。
- 一度に複数のリクエストを送信するとトランザクションが壊れる理由を知っていますか?
- バッファリングされたリクエストのリストを使用することで、私のコードを本当に最適化できると思いますか?