MySQL と Entity Framework を使用して ASP.NET / C# で webapp を開発しています。値を +1 ずつ増やして頻繁に更新されるいくつかのカウンター列を使用したいと考えています。カウンター列が存在する製品テーブルがあります。2 つの質問があります。
1) カウンター用に 2 つ目のテーブルを使用する必要がありますか? - メインの製品テーブルは頻繁に読み取られます。行を非常に頻繁に更新すると、カウンターが更新されるたびに行がロックされるため、パフォーマンスが低下する可能性があります (私は InnoDB を使用しています)。
2) MySQL と Entity Framework を使用して行を +1 インクリメントする最良の方法は何ですか? カウンターが 100% 正確であることは気にしないので、更新の競合があればキャッチできますが、更新なしで合格できます。ほとんどの更新は迅速に行われ、更新に含まれると思います。
これを実装するために使用しているコードを追加して、静的変数を利用してデータベースへの頻繁な書き込みを防ぎます。
コード:
if (Global.DataCounters != null)
{
if (Global.DataCounters.ContainsKey(id))
{
int new_value = ++Global.DataCounters[id];
Global.DataCounters.Remove(id);
Global.DataCounters.Add(id, new_value);
// check datatime
if ((DateTime.Now - Global.LastFlushed).Minutes > 10)
{
// update counter in db and reset data
Global.LastFlushed = DateTime.Now;
}
}
else
{
// first time view of a device, set to zero views
Global.DataCounters.Add(id, 1);
}
}
else
{
Global.DataCounters = new Dictionary<int, int>();
}
Global.asax:
public static Dictionary<int, int> DataCounters = new Dictionary<int,int>();
public static DateTime LastFlushed;
void Application_Start(object sender, EventArgs e)
{
LastFlushed = DateTime.Now;
RegisterRoutes(System.Web.Routing.RouteTable.Routes);
}
いい実装だと思いませんか?
ありがとう