Использование статических методов или каких-либо статических методов в классе Dao?

Привет, я генерирую классы Dao для некоторых операций с БД

таким образом, лучше ли использовать методы класса Dao как статические или не статические?

С помощью примера dao class ниже, если несколько клиентов получили метод AddSampleItem в одно и то же время? Как это может произойти?

public class SampleDao
{
  static DataAcessor dataAcessor 

  public static void AddSampleItem(object[] params)
  {
      dataAcessor =new DataAcessor();
       //generate query here
       string query="..."
      dataAcessor.ExecuteQery(query);
      dataAcessor.Close(); 
   }

  public static void UpdateSampleItem(object[] params)
  {
      dataAcessor =new DataAcessor();
       //generate query here
       string query="..."
      dataAcessor.ExecuteQery(query);
      dataAcessor.Close(); 
   }
}

Ответ 1

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

Я бы использовал локальный DataAcessor или создал новый и использовал его во всех методах в зависимости от того, как вы хотите управлять временем жизни DataAcessor.

public class SampleDao
{
  public void AddSampleItem(object[] params)
  {
      DataAcessor dataAcessor =new DataAcessor();
      // ...
  }

  public void UpdateSampleItem(object[] params)
  {
      DataAcessor dataAcessor =new DataAcessor();
      // ...
  }
}

Ответ 2

Я всегда предпочитаю нестатические классы. Зависимости не могут быть введены в статический класс, а модульные тесты сложнее. Кроме того, его клиенты не могут заменить его тестовым двойным при их тестировании.

http://googletesting.blogspot.com/2008/12/static-methods-are-death-to-testability.html

Ответ 3

этот код не является потокобезопасным, как вы его написали.

Если у вас есть поле dataAccessor и методы static, подобные этому, у вас будут проблемы с concurrency, когда несколько клиентов будут бить этот код в одно и то же время. вероятно, у вас появятся очень странные исключения, и даже возможно, что один клиент может увидеть другие данные клиента.

избавиться от static от этих методов и этого поля и создать экземпляр SampleDao для каждого клиента.

Ответ 4

Присвоение новому объекту DataAccessor статической ссылке DataAccessor в каждом методе приведет к проблемам concurrency. У вас все еще есть статические методы в классе SampleDao, но убедитесь, что вы удалили статическую ссылку на DataAccessor. Чтобы использовать DataAccessor, создайте локальный экземпляр. Таким образом вы можете избежать проблем concurrency. Недостатком здесь является каждый раз, когда вы вызываете статический метод, создается экземпляр DataAccessor.

Даос в большинстве случаев является безстоящим. В этих случаях я не вижу смысла использовать нестатические методы в Daos, потому что нам нужно создать экземпляр этого dao для доступа к его методу.

Ответ 5

Бруно верен. Однако вы также можете добавить синглтон и использовать "блокировку" для однопоточной части вашего приложения. Однако имейте в виду, что запросы собираются в очередь, и если ваш запрос требует времени, производительность вашего приложения будет ухудшаться. Это особенно заметно в веб-приложении. Для мобильного или настольного приложения "блокировка" определенно подходит.