在winforms应用程序中,数据集在内存中保留多长时间?
本文关键字:长时间 保留 数据集 winforms 应用程序 内存 | 更新日期: 2023-09-27 18:05:16
我有一个关于windows窗体应用程序中的数据集的问题。
第1部分:
问题:
1)每次实例化时都要访问数据库。
第2部分:
假设:
- 第一个问题的答案是正确的
- 我正在使用的数据集具有相对较少的数据量,并且应用程序本身不会有大量并发用户。
- 表单的数量可能相当高,但需要相同的数据集。
问题:
1)在内存中存储数据集的静态版本是一个坏主意吗?
选项(评价这些可能的解决方案):
选项1:创建一个静态类作为数据集的容器。
选项2:在表单需要的地方创建一个数据集,然后为任何依赖于该数据集的后续表单创建一个属性,并将对该数据集的引用传递给特定表单,从而防止GC重新分配内存(并减少数据库调用的数量)。
伪代码:这是实例化数据集的父窗体。
public partial class ParentForm: Form
{
private DataSet dataset;
public ParentForm()
{
//logic that populates dataset
}
Button_Click(object sender, EventArgs e)
{
DependentOnDataSetForm dependent = new DependentOnDataSetForm(dataset);
}
}
伪代码:这是一个依赖于相同数据集的表单。
public partial class DependentOnDataSetForm : Form
{
private DataSet dataset;
public DependentOnDataSetForm (DataSet dataset)
{
this.dataset = dataset;
}
// Another from that depends on the same dataset.
Button_Click(object sender, EventArgs e)
{
DependentOnDataSetForm2 dependent = new DependentOnDataSetForm2(dataset);
}
}
附加问题:(不适用于我目前的情况,但知道以后参考很好)
创建多个数据集是好还是坏?仅负责某些表单所需的某些数据的XSD文件。例如(纯粹假设):假设我有一个订单服务,负责填写订单,这个特定的服务将需要访问订单表、客户表、发货表等。那么,创建一个只包含所需表的.xsd文件是个好主意吗?
问题1的答案是否定的。DataSet对象被认为是ADO。NET断开连接的对象。因此,它不会击中数据库。你可以用ADO连接对象(即DataAdapter)的结果实例化一个数据集,但数据集本身不连接到数据库。
我会选择选项2,但要注意它是一个引用对象,一种形式的变化可能会影响另一种形式。
- 数据集只有在表或数据适配器上使用Fill()填充时才会命中DB。
- 值得存储数据缓存的单个实例(DataSet实际上是)。当然,如果你不介意对更新多加注意的话。数据集经常用于GUI数据绑定,需要记住的是,无论这个数据集发生了什么变化-这些都应该发生在UI线程中。
处理完数据集后,总是可以调用Dispose()方法。然后,当您想再次使用它时,您可以实例化它的新实例。