2016-08-02 9 views
0

静的/共有クラスの管理対象オブジェクトを解放するためのベストプラクティスは何ですか?静的クラスの管理対象オブジェクトの解放

私は3つの大きなデータシートを保持しており、ほとんどの場合、それらを使用していません。

GCは静的であるため、GCを解放しません - そうですか?

ReleaseDatatables()でヌルに設定すると便利なのか、それとも私は時間を無駄にしているのでしょうか?

ありがとうございます。

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; 
     } 
+1

_「大型の3つのデータシートを保持していますが、大部分は使用しないでください」なぜそれらを保存するのですか?_データベースに_必要なときに古いデータを保存しないでください。 –

+0

私はそれをオプションと見なしましたが、それらをnullに設定することが有用かどうか疑問に思っています – jonathana

+0

キャッシュデータは、作成するのに費用がかかり、安くても賢明です。 DataTableは、作成するのに費用がかかり、通常は費用がかかりすぎるという区別があります。行数に応じて決して少なくない数値。しかし、チーム、支店、部署などのデータ項目には妥当な上限があります。唯一の他の懸念事項は、dbaseテーブルが変更されたときにデータが簡単に失効することです。決定を行うことはプログラマーの仕事ですが、私たちはあなたのためにそれを行うことはできません。 –

答えて

1

GCは、メモリーを解放できるかどうかの情報を計算するときに「ルーツ」をチェックします。参照型変数がルートに結び付けられている場合、オブジェクトは収集されません。

静的オブジェクトはこのルーツのものなので、変数にnullを設定すると、大きなデータはルーツに結び付けられず解放されます。

また、あなたがWeakReference object types here に見てみることができますそれはあなたのケース


更新

のための別のアプローチです。しかし、あなたのソリューションは私のためのベストプラクティスではないようです。どのくらいのデータがそこに格納されているかわからないので、dbテーブルからすべてのデータを読み取ることは非常に危険です。プロパティをIEnumerableにして、このキャッシングなしでデータのチャンクで "yield return"を使用する方が良いでしょう。もちろん、あなたがしようとしていることのコンテキストにもよります。

+0

ありがとうございます、私は更新セクションで書いたプラクティスを支持します。 – jonathana

1

はい。しかし、静的クラスは解放する必要はありません。

静的クラスはオブジェクトではなく、メモリを消費しないため、解放する必要はありません。

静的クラスの静的フィールドは、メモリを消費するオブジェクトです。アプリケーションが終了するまでアクセス可能であるため、公開されません。 メモリを解放する場合は、フィールドをnullに設定します。

関連する問題