gpt4 book ai didi

asp.net - 在后台线程上对数据库进行排队和执行插入

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:46 24 4
gpt4 key购买 nike

我在网络场(3 台服务器)中有一个 asp.net 应用程序。除了该应用程序之外,我还有一个模块可以将网站发出的每个请求记录到数据库中。目前插入是同步的。我想更改它,以便将插入内容发送到一个队列,该队列将尽可能地插入它们。

会不会更好

  1. 尝试在后台线程中插入每个请求(也会如果数据库出现问题,许多后台线程会被用完?)

  2. 在单个后台线程上启动进程内队列 从队列中读取并执行插入。

  3. 在数据库服务器上创建一个进程外队列,每个服务器都将页面请求日志发送到该队列。内置的 MSMQ 是否适合用于此类用途? - 还是会矫枉过正?

最佳答案

选项 2 听起来最好。选项 1 肯定会创建太多后台线程,而选项 3 听起来比它需要的更复杂。

你可以尝试这样的事情。

给定这个类:

class LogEntry
{
public string IpAddress { get; set; }
public string UserAgent { get; set; }
public DateTime TimeStamp { get; set; }
public string Url { get; set; }
//whatever else you need
}

使用这个类来执行日志记录:

class SiteLogger
{
private static object loggerLock = new object();
private static List<LogEntry> _pendingEntries = new List<LogEntry>();
private static Thread savingThread;

public static void AddEntry(LogEntry entry)
{
// lock when accessing the list to avoid threading issues
lock (loggerLock)
{
_pendingEntries.Add(entry);
}

if (savingThread == null)
{
// this should only happen with the first entry
savingThread = new Thread(SaveEntries);
savingThread.Start();
}
}

private static void SaveEntries()
{
while (true)
{
while (_pendingEntries.Count > 0)
{
// lock around each individual save, not the whole loop
// so we don't force one web request to wait for
// all pending entries to be saved.
lock (loggerLock)
{
// save an entry to the database, however the app does that
MyDatabase.SaveLogEntry(_pendingEntries[0]);
_pendingEntries.RemoveAt(0);
}
}

Thread.Sleep(TimeSpan.FromSeconds(2));
// 2 seconds is a bit of an arbitrary value. Depending on traffic levels,
// it might need to go up or down.
}
}
}

我用一个简单的命令行测试应用程序运行了这个,没有任何数据库参与(通过休眠 10 毫秒来模拟数据库调用)并且它似乎工作得很好,但显然应该在进入生产环境之前进行更多测试。此外,如果请求的速度快于您将它们保存到数据库的速度(这不太可能,但应该考虑),当然会出现问题。

更新,2018 年 2 月:现在看这个,我意识到如果线程计时不走运(你应该假设你会)。 new Thread() 是现在在 C# 中执行此类操作的一种旧方法。我将把现代的、更线程安全的实现作为练习留给读者。

关于asp.net - 在后台线程上对数据库进行排队和执行插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9641418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com