【发布时间】:2016-08-02 08:48:13
【问题描述】:
在静态/共享类中释放托管对象的最佳做法是什么?
我持有 3 个大型数据表,大部分时间不使用它们。
GC 不会释放它们,因为它们是静态的 - 对吗?
我想知道在 ReleaseDatatables() 中将它们设置为 null 是否有用,还是我只是在浪费时间?
谢谢。
public static class Helpers
{
private static DataTable _branchDT;
public static DataTable branchDT
{
get
{
if (_branchDT == null)
{
_branchDT = new DataTable();
_branchDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Branches").Tables[0];
return _branchDT;
}
else
{
return _branchDT;
}
}
set { _branchDT = value; }
}
private static DataTable _departmentDT;
public static DataTable departmentDT
{
get
{
if (_departmentDT == null)
{
_departmentDT = new DataTable();
_departmentDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Departments").Tables[0];
return _departmentDT;
}
else
{
return _departmentDT;
}
}
set { _departmentDT = value; }
}
private static DataTable _TeamsDT;
public static DataTable TeamsDT
{
get
{
if (_TeamsDT == null)
{
_TeamsDT = new DataTable();
_TeamsDT = Orange.ProjectManagment.DAL.Database.getDataset("SELECT * FROM Teams").Tables[0];
return _TeamsDT;
}
else
{
return _TeamsDT;
}
}
set { _TeamsDT = value; }
}
/// <summary>
/// setting all datatables to null in order to free memory or to make them refresh them self in the next call to get property method
///
/// </summary>
public static void ReleaseDatatables()
{
// datatables set to null, hence next call to them they will refresh via new query to db in get prop method
branchDT = null;
departmentDT = null;
TeamsDT = null;
}
【问题讨论】:
-
“我持有 3 个大型数据表,大部分时间都不使用它们”那你为什么要存储它们呢? 当你向数据库询问数据时需要它,不要将旧数据保存在内存中。
-
我认为这是一个选项,但仍然想知道将它们设置为 null 是否有用
-
在创建成本高且保留成本低的情况下缓存数据是明智的。 DataTable 的区别在于它的创建成本很高,而且维护起来通常也很昂贵。根据行数,一个永远不会减少的数字。然而,像团队、分支机构和部门这样的数据项应该有一个合理的上限。唯一的另一个问题是,当 dbase 表更改时,您的数据可能很容易变得陈旧。做决定是程序员的工作,我们不能替你做。
-
根据 MS 的说法,当“操作足够昂贵,您想与用户沟通,他们应该考虑缓存结果。”时使用一种方法。详情:msdn.microsoft.com/en-us/library/…
标签: c# .net vb.net memory-management