1


1

データベースからデータを読み取った後、一時データストレージにHashTableを使用する

私は意見と最高のコーディング慣行を探しています。

SELECT this、that FROM MyDB(2つのフィールドを返す)などのクエリを使用して、データベースから情報を取得する必要があります。

  1. 一時ストレージにハッシュテーブルを使用するのは間違っていますか?

  2. 同じことを達成するためのより良い方法はありますか?

  3. 2つ以上のフィールドを返す場合はどうでしょうか? 「DataSet」などにステップアップしますか?

シンプルな効率を探しています。

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
    }
}

6 Answer


1


提案しているのは、プログラム内のテーブル全体をローカルにキャッシュすることです。 これには長所と短所があります。

利点:

  • 多数の小さなクエリの場合は高速で、通信する必要があります データベースは1回のみ。

  • 保持する必要なく、データの不変のコピーを取得します トランザクションが開いています。

  • データベースがオフラインになっても、データにアクセスできます。

デメリット:

  • ライブデータを取得しません。

  • 初めて、またはアプリケーションの起動時に遅くなる テーブル全体。

  • クライアントで大量のメモリを使用します。

  • ローカルコピーを更新しても、データは自動的に更新されません。 データベース。

結論:

通常はこれを行うべきではなく、必要なときに必要な値をデータベースに要求するだけです。 しかし、それが理にかなっている場合があります。


1


あなたの最善の策は、本当のシンプルなデータオブジェクトを作成することです。

private class MyData
{
    public int Id { get; set; }
    // Etc
}

次に、強く型付けされた辞書クラスを使用します。

Dictionary myDbCache = new Dictionary();


0


1つのキー/値ペアだけの `DictionaryEntry`を検討したか、2つの名前付きプロパティを持つドメインオブジェクトを使用しましたか?


0


それはテーブルにいくつのレコードがあるか、そしてハッシュキーがどれだけ「ランダム」であるかに依存します。 キーが同じスロットにハッシュされないようにして、衝突を回避し、パフォーマンスの低下を防ぎます。


0


キー/パー値を保存する必要がある場合は、HashTableではなく「Dictionary」を選択することをお勧めします。


0


複数のページからデータにアクセスする必要がある場合(おそらくそうです)、それらを静的フィールド(実際にはディクショナリを使用して)に保存できるため、アプリケーション全体に対して1回(ユーザーごとに1回)ロードする必要があります。

ここでシングルトンにカプセル化されています:

public class Globals
{
  private Context _current;
  private Dictionary _dbValues;

  public Dictionary 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];