Используйте HashTable для временного хранения данных после чтения данных из базы данных - PullRequest
1 голос
/ 05 февраля 2010

Я ищу мнения и лучшие практики кодирования.

Мне нужно получить информацию из базы данных с запросом, таким как 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 ]

1 голос
/ 05 февраля 2010

Ваш лучший выбор - создать действительно простой объект данных.

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

Далее используйте строго типизированный словарь класса.

Dictionary<int, MyData> myDbCache = new Dictionary<int, MyData>();
1 голос
/ 05 февраля 2010

То, что вы предлагаете, это локальное кэширование всей таблицы в вашей программе.Это имеет свои преимущества и недостатки:

Преимущества:

  • Быстрее для большого количества мелких запросов, необходимо общаться с базой данных только один раз.
  • Вы получаете неизменную копиюданных без необходимости держать транзакцию открытой.
  • Вы по-прежнему можете обращаться к своим данным, даже если база данных отключена.

Недостатки:

  • Вы не получите оперативные данные.
  • Замедлите в первый раз или при запуске приложения, так как оно должно прочитать всю таблицу.
  • Использует много памяти на клиенте.
  • Обновление вашей локальной копии не приведет к автоматическому обновлению данных в базе данных.

Вывод:

Обычно вы не должны этого делать, вам просто нужно запросить базу данныхдля значений, которые вы хотите, когда они вам нужны.Но бывают моменты, когда это может иметь смысл.

0 голосов
/ 05 февраля 2010

Если к вашим данным нужно получить доступ с нескольких страниц, что, вероятно, имеет место, вы можете хранить их в статическом поле (на самом деле, используя словарь), поэтому их необходимо загрузить один раз для всего приложения (против одного пользователя ).

Здесь инкапсулировано в синглтоне:

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];
0 голосов
/ 05 февраля 2010

Я бы рекомендовал вам выбрать Dictionary<string,string>, а не HashTable, если вам нужно хранить значения ключа / номинала.

0 голосов
/ 05 февраля 2010

Это будет зависеть от того, сколько записей у вас есть в вашей таблице, и насколько «случайным» будет хеш-ключ. Вы хотите избежать хеширования ключей в одном и том же слоте, чтобы избежать коллизий и, следовательно, снижения производительности.

0 голосов
/ 05 февраля 2010

Рассматривали ли вы DictionaryEntry только для одной пары ключ / значение или используете объект домена с двумя именованными свойствами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...