データベースにデータを格納するためにクライアント側から呼び出されるWebサービスを作成しました。これらのデータは、1人のユーザーから200ミリ秒ごとに送信され、データが送信されるたびにデータベース接続が開かれ、閉じられます。これはパフォーマンスには悪いと思います。Webサービスからのデータベース処理 - パフォーマンスを向上させる方法
データがREST.StoreAcceleration()メソッドとSQLWorks.StoreAcceleration()は、次の方法を呼び出すことによって格納されます。
public Response StoreAcceleration(string strSessionString, string strMeasurementTime, string strAccelerationX, string strAccelerationY, string strAccelerationZ)
{
SQLWorks sqlWorks = new SQLWorks();
Response response = new Response();
try
{
string strTime = strMeasurementTime.Replace("_", " ");
DateTime measurementTime = DateTime.ParseExact(strTime, "yyyy-MM-dd HH:mm:ss:fff", null);
double accelerationX = Convert.ToDouble(strAccelerationX.Replace(".", ","));
double accelerationY = Convert.ToDouble(strAccelerationY.Replace(".", ","));
double accelerationZ = Convert.ToDouble(strAccelerationZ.Replace(".", ","));
sqlWorks.StoreAcceleration(strSessionString, measurementTime, accelerationX, accelerationY, accelerationZ);
response.Successful = true;
response.Comment = "Stored!";
}
catch(Exception ex)
{
string sDummy = ex.ToString();
response.Comment = "an error occured!";
response.Successful = false;
}
return response;
}
public bool StoreAcceleration(string strStringSession, DateTime receivedTime, double accelerationX, double accelerationY, double accelerationZ)
{
bool result = false;
string select =
"INSERT INTO acceleration (session_id, measurement_time, acceleration_x, acceleration_y, acceleration_z) VALUES (@sessionID, @measurementTime, @accelerationX, @accelerationY, @accelerationZ)";
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(select, conn);
int sessionID = getSessionID(strStringSession);
if(sessionID == 0)
return false;
updateSessions(sessionID);
string strRecordTime = receivedTime.ToString("yyyy-MM-dd HH:mm:ss:fff");
cmd.Parameters.AddWithValue("sessionID", sessionID.ToString());
cmd.Parameters.AddWithValue("measurementTime", strRecordTime);
cmd.Parameters.AddWithValue("accelerationX", accelerationX.ToString());
cmd.Parameters.AddWithValue("accelerationY", accelerationY.ToString());
cmd.Parameters.AddWithValue("accelerationZ", accelerationZ.ToString());
try
{
conn.Open();
cmd.ExecuteNonQuery();
result = true;
}
catch(Exception ex)
{
string sDummy = ex.ToString();
}
finally
{
conn.Close();
}
return result;
}
ここでの問題は、SqlConnectionオブジェクトが開かれ、すべてのメソッド呼び出しに閉じていることです。
頻繁なデータベース接続の開閉を防ぐために、誰かが解決策を提案することができれば幸いです。
ありがとうございます!
実際にパフォーマンスに問題がありますか、それともその最適化のためだけに最適化していますか? –
パフォーマンスに問題がある場合は、データベースの側面を詳しく見ていきます。コードを少しきちんと整理したにもかかわらず、目立つほど速くはありません。 *接続プールが実際に無効にされていない限り。 – Thorarin