gpt4 book ai didi

asp.net-mvc-2 - 在 ASP.NET MVC 中,单例是否会在请求之间自动保留?

转载 作者:行者123 更新时间:2023-12-01 13:05:22 24 4
gpt4 key购买 nike

我有一个包含数千个整数的查找表 (LUT),我在大量请求中使用它来根据从数据库中获取的内容计算内容。

如果我只是创建一个标准的单例来保存 LUT,它会在请求之间自动保留还是我需要特别将其推送到应用程序状态?

如果它们是自动持久化的,那么将它们与应用程序状态存储有什么区别?

正确的单例实现是什么样子的?它不需要延迟初始化,但需要线程安全(每个服务器实例理论上有数千个用户)并且具有良好的性能。

编辑:Jon Skeet 的第 4 版看起来很有前途 http://csharpindepth.com/Articles/General/Singleton.aspx

public sealed class Singleton
{
static readonly Singleton instance=new Singleton();

// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}

Singleton()
{
}

public static Singleton Instance
{
get
{
return instance;
}
}

// randomguy's specific stuff. Does this look good to you?
private int[] lut = new int[5000];

public int Compute(Product p) {
return lut[p.Goo];
}
}

最佳答案

是的,静态成员持续存在(与持续存在不同——它不是“保存”的,它永远不会消失),这将包括单例的实现。您可以免费获得一定程度的惰性初始化,就好像它是在静态赋值或静态构造函数中创建的一样,在相关类首次使用之前不会调用它。默认情况下,该创建锁定,但所有其他用途都必须像您所说的那样是线程安全的。考虑到所涉及的并发程度,那么除非单例是不可变的(您的查找表在应用程序生命周期内不会改变),否则您必须非常小心地更新它(一种方法是假单例- 在更新时,您创建一个新对象,然后锁定分配它以替换当前值;严格来说不是单例,尽管它看起来像“从外面看”)。

最大的危险是任何引入全局状态的东西都是可疑的,尤其是在处理像网络这样的无状态协议(protocol)时。不过,它可以很好地使用,尤其是作为永久或近乎永久数据的内存缓存,尤其是当它涉及无法从数据库中轻松快速获取的对象图时。

虽然陷阱很大,但要小心。特别是,不能低估锁定问题的风险。

编辑,以匹配问题中的编辑:

我最关心的是数组是如何初始化的。显然这个例子是不完整的,因为它的每一项都只有 0。如果它在初始化时被设置并且是只读的,那么很好。如果它是可变的,那么要非常非常小心你的线程。

还要注意太多此类查找对缩放的负面影响。虽然您为大多数请求节省了预计算,但结果是在更新单例时有一段非常繁重的工作。一个长期的启动可能是可以容忍的(因为它不会经常发生),但之后发生的任意减速可能很难追溯其来源。

关于asp.net-mvc-2 - 在 ASP.NET MVC 中,单例是否会在请求之间自动保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463850/

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