C# 从数据库读取数据后,使用哈希表进行临时数据存储
我正在寻找意见和最佳编码实践 我需要通过一个查询从数据库中获取信息,比如C# 从数据库读取数据后,使用哈希表进行临时数据存储,c#,asp.net,hashtable,C#,Asp.net,Hashtable,我正在寻找意见和最佳编码实践 我需要通过一个查询从数据库中获取信息,比如从MyDB中选择this,that(返回2个字段) 使用哈希表作为临时存储是否错误 有没有更好的方法来完成同样的事情 如果我返回的字段超过2个,那么最好是升级到数据集还是什么 我在寻找简单的效率 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {
从MyDB中选择this,that
(返回2个字段)
数据集
还是什么public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GetData();
foreach (DictionaryEntry de in ht)
{
DoSomething(Convert.ToInt32(de.Key), de.Value.ToString());
DoMore(Convert.ToInt32(de.Key), de.Value.ToString());
//etc...
}
}
Hashtable ht = new Hashtable();
private void GetData()
{
//connect to DB and use reader to fill hashtable ht with results..
}
private void DoSomething(int key, string value)
{
//do something with hashtable ht data
}
private void DoMore(int key, string value)
{
//do something else with hashtable ht data
}
}
您是否考虑过仅为一个键/值对使用
字典入口
,或使用具有两个命名属性的域对象?您的建议是在程序中本地缓存整个表。这有优点也有缺点:
优点:
- 对于许多小查询来说,速度更快,只需与数据库通信一次
- 您可以获得数据的不变副本,而无需保持事务处于打开状态
- 即使数据库脱机,您仍然可以访问数据
- 你无法获得实时数据
- 第一次或在应用程序启动时减慢速度,因为它必须读取整个表
- 在客户端上使用大量内存
- 更新本地副本不会自动更新数据库中的数据
通常您不应该这样做,您应该在需要时向数据库请求所需的值。但有时它可能有意义。这取决于表中有多少记录,以及散列键的“随机”程度。您希望避免将密钥散列到同一个插槽以避免冲突,从而降低性能。您最好的选择是创建一个真正简单的数据对象
private class MyData
{
public int Id { get; set; }
// Etc
}
接下来,使用强类型字典类
Dictionary<int, MyData> myDbCache = new Dictionary<int, MyData>();
Dictionary myDbCache=newdictionary();
如果您需要存储键值/par值,我建议您选择字典而不是哈希表。如果您的数据需要从多个页面访问(可能是这样),您可以将它们存储在静态字段中(实际上使用字典),因此需要为整个应用程序加载一次(对每个用户一次)
这里封装在一个单例中:
public class Globals
{
private Context _current;
private Dictionary<int, string> _dbValues;
public Dictionary<int, string> DbValues
{
get
{
if (_dbValues == Null)
{
// ... Load our data here
}
return _dbValues;
}
set
{
}
public Globals Current
{
get
{
if(_current == Null)
_current = Context();
return _current;
}
}
private Globals()
{ }
}
// Can be used this way
var value = Globals.Current.DbValues[key1];
公共类全局变量
{
私有上下文_当前;
私有字典_dbValues;
公共字典值
{
得到
{
if(_dbValues==Null)
{
//…在这里加载我们的数据
}
返回_dbValues;
}
设置
{
}
公共全球流动
{
得到
{
如果(_current==Null)
_当前=上下文();
返回电流;
}
}
私有全局()
{ }
}
//可以这样使用
var value=Globals.Current.DbValues[key1];
谢谢您的示例,字典看起来是一个不错的选择。我有一个问题,如果我正在制作一个实时应用程序(使用SignalR),它有意义吗使用字典临时存储一个标志?例如,如果用户发送了请求a,正在等待另一个用户发送他的请求B,那么在两个请求都收到后,它会插入数据库吗?