ConfigurationManager.AppSettings性能问题

时间:2020-03-05 18:38:11  来源:igfitidea点击:

我打算将所有配置设置存储在应用程序的app.config部分中(使用ConfigurationManager.AppSettings类)。当用户使用应用程序的UI更改设置(单击复选框,选择单选按钮等)时,我打算将这些更改写出到" AppSettings"中。同时,在程序运行时,我计划从一个将不断处理数据的进程中不断访问" AppSettings"。通过UI更改设置需要实时影响数据处理,这就是进程将不断访问AppSettings的原因。

关于性能,这是个好主意吗?编写.Net应用程序时,使用AppSettings应该是"正确的方式"来存储和访问配置设置,但是我担心此方法并非用于恒定的负载(至少就不断读取设置而言) 。

如果有人对此有经验,我将不胜感激。

更新:我可能应该澄清几点。

这不是Web应用程序,因此仅将数据库连接到应用程序对于存储配置设置可能就显得过头了。这是Windows窗体应用程序。

根据MSDN文档,ConfigurationManager不仅用于存储应用程序级别设置,还用于存储用户设置。 (例如,在将应用程序安装为部分信任应用程序时,尤其重要。)

更新2:我接受lomaxx的回答,因为`Properties'确实确实是一个不错的解决方案,而不必在我的应用程序(例如数据库)中添加任何其他层。使用属性时,它已经完成了其他建议的所有缓存。这意味着所有更改和后续读取都在内存中完成,这使其速度非常快。仅当我们明确告知更改时,属性才会将更改写入磁盘。这意味着我可以在运行时即时更改配置设置,然后仅在程序退出时最终保存到磁盘。

只是为了验证它实际上能够处理我需要的负载,我在笔记本电脑上进行了一些测试,并使用Properties能够每秒进行750,000次读取和7,500次写入。到目前为止,这远远超出了我的应用程序的需求,甚至超出了我的需求,在使用Properties而不影响性能的情况下,我感到非常安全。

解决方案

回答

如果我错了,请有人纠正我,但是我不认为AppSettings通常用于这些类型的配置设置。通常,我们只会输入保持相当静态的设置(数据库连接字符串,文件路径等)。如果要存储可自定义的用户设置,最好创建一个单独的首选项文件,或者最好将这些设置存储在数据库中。

回答

请问为什么不将用户设置保存在数据库中?

通常,我将很少更改的应用程序设置保存在appSettings部分中(将默认电子邮件地址错误日志发送至,自动注销的分钟数,等等)。 ,而不是由用户决定,通常用于部署设置。

回答

我要看的一件事是在读取时缓存appsettings,然后在写入时从缓存中清除设置,这应该最小化服务器为处理appSettings而必须处理的实际负载。

另外,如果可能,请查看将appSettings分解为configSections,以便我们可以读取与写入和缓存相关的设置。

综上所述,我似乎会认真考虑将这些值存储在数据库中,因为我们似乎实际上是在存储用户首选项而不是应用程序设置。

回答

查看SQLite,对于这种特定情况,这似乎是一个不错的选择。

回答

我不会使用配置文件来存储用户数据。使用数据库。

回答

因为我们使用的是Winforms应用程序,所以如果它在.net 2.0中,则实际上存在一个为此目的而设计的用户设置系统(称为"属性")。 MSDN上的这篇文章对此做了很好的介绍。

如果我们仍然担心性能,那么请查看类似于SQLite的SQL Compact Edition,但我发现它是Microsoft产品,它与Winforms配合得很好,甚至可以使其与Linq一起使用

回答

迪伦

不要为此目的使用应用程序配置文件,而要使用SQL DB(SQLite,MySQL,MSSQL等),因为在配置文件的读写过程中我们不必担心并发问题。

我们还将在要存储的数据类型上具有更好的灵活性。 appSettings部分只是一个键/值列表,随着时间的流逝和应用的成熟,我们可能会不再满意。我们可以使用自定义配置部分,但随后涉及到设计的新问题区域。

回答

appSettings并非真正针对我们要尝试的操作。

.NET应用程序启动时,它将读取app.config文件,并将其内容缓存在内存中。因此,在写入app.config文件后,我们必须以某种方式强制运行时重新解析app.config文件,以便它可以再次缓存设置。没必要

最好的方法是使用数据库存储配置设置。

除非使用数据库,否则我们可以轻松地设置外部XML配置文件。应用程序启动时,可以将其内容缓存在NameValueCollection对象或者HashTable对象中。更改/添加设置时,将对已缓存的副本进行设置。当应用程序关闭或者在适当的时间间隔时,我们可以将缓存内容写回到文件中。