gpt4 book ai didi

c# - 确保 Singleton 只调用数据库查询一次

转载 作者:太空狗 更新时间:2023-10-30 01:21:39 24 4
gpt4 key购买 nike

我正在尝试创建一个负责读取所有用户访问设置的对象。

我已经这样创建了类:

public class SettingsManager
{
private static string _connString =
@"Data Source=MyDB;Initial Catalog=IT;Integrated Security=True;Asynchronous Processing=true;";
private const string _spName = "SettingTest";
private IEnumerable<string> _mySettings;
private static readonly Lazy<SettingsManager> _instance = new Lazy<SettingsManager>(() => new SettingsManager());

private SettingsManager()
{
//Console.WriteLine("Hello from constructor");
if (_mySettings == null)
_mySettings = ReadSettings();
}

public static SettingsManager Instance
{
get { return _instance.Value; }
}

public bool CanDo(string setting)
{
return _mySettings.Contains(setting);
}

private IEnumerable<string> ReadSettings()
{
try
{
using (var conn = new SqlConnection(_connString))
{
using (var cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = _spName;
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
using (var reader = cmd.ExecuteReader())
{
return reader.Select(SettingParser).ToList();
}
}
}
}
catch
{
}
return null;
}

private string SettingParser(SqlDataReader r)
{
try
{
return r[0] is DBNull ? null : r[0].ToString();
}
catch
{
}
return null;
}
}

和 SqlDataReader 扩展

public static class DBExtensions
{
public static IEnumerable<T> Select<T>(
this SqlDataReader reader, Func<SqlDataReader, T> projection)
{
while (reader.Read())
{
yield return projection(reader);
}
}
}

然后在我的应用程序中我可以这样调用它:

SettingsManager.Instance.CanDo("canWrite")

这会根据用户访问级别返回 true/false 值。

我的问题是:

  1. 这个线程安全吗?数据库是否有可能被多次查询?如何预防?

  2. 我应该使用 await 和 async 吗?我只查询数据库一次。我该如何改进呢? (await 和 async 对我来说真的很新,因为我刚从 .NET3.5 迁移到 4.5)

最佳答案

1) Is this thread safe?

是的。

Are there any chances DB will be query multiple times?

没有。

2) Should I use await and async?

这将取决于您是否需要异步访问您的数据库。如果您需要,可以使用异步 ADO.NET API。

关于c# - 确保 Singleton 只调用数据库查询一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14932387/

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