我正在使用 MySQL 和实体框架在 ASP.NET / C# 中开发一个 webapp。我想使用一些计数器列,它们会通过增加它们的值 +1 来经常更新。我有一个计数器列所在的产品表。我有两个问题:
1) 我应该为柜台使用第二张桌子吗?- 主产品表会被频繁读取,如果我非常频繁地更新行会损害性能,因为每次更新计数器时行都会被锁定(我使用 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>();
}
全球.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);
}
你认为这是一个很好的实现吗?
谢谢