Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 在Dao类中使用静态方法还是非静态方法?_Class_Static_Dao - Fatal编程技术网

Class 在Dao类中使用静态方法还是非静态方法?

Class 在Dao类中使用静态方法还是非静态方法?,class,static,dao,Class,Static,Dao,嗨,我为一些DB操作生成Dao类 以这种方式使Dao类的方法是静态的还是非静态的更好 使用下面的示例dao类,如果有多个客户机同时使用AddSampleItem方法?这会产生什么结果 public class SampleDao { static DataAcessor dataAcessor public static void AddSampleItem(object[] params) { dataAcessor =new DataAcessor();

嗨,我为一些DB操作生成Dao类

以这种方式使Dao类的方法是静态的还是非静态的更好

使用下面的示例dao类,如果有多个客户机同时使用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(); 
   }
}

此代码不是您编写的线程安全的

如果您有dataAccessor字段和静态方法(如下面所示),那么多个客户机同时命中此代码时会出现并发问题。很可能会出现非常奇怪的异常,甚至一个客户端可能会看到另一个客户端的数据


去掉这些方法和这个字段上的static,为每个客户机实例化一个新的SampleDao实例。

这将导致一个大混乱。如果您同时从不同的线程添加两个项目,那么如果一个线程在另一个线程完成之前关闭
DataAcessor
,您肯定会得到非常奇怪的结果,甚至会出现错误

我会使用一个本地的
DataAcessor
或创建一个新的,并在所有方法中使用它,具体取决于您希望如何管理
DataAcessor
的生存期

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

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

我总是喜欢非静态类。依赖项不能注入到静态类中,单元测试更加困难。而且,当它的客户端进行单元测试时,不能用测试双精度替换它


在每个方法中将新的DataAccessor对象分配给静态DataAccessor引用将导致并发问题。您仍然可以在SampleDao类中使用静态方法,但请确保删除对DataAccessor的静态引用。要使用DataAccessor,请创建一个本地实例。这样可以避免并发问题。这里的缺点是每次调用静态方法时,都会创建DataAccessor的实例


大多数情况下dao是无状态的。在这些情况下,我认为在dao中使用非静态方法没有任何意义,因为我们需要创建该dao的实例来访问其方法。

Bruno是正确的。不过,您也可以添加一个单线程,并使用“锁”来锁定应用程序的单线程部分。但请记住,请求将排队,如果查询需要时间,应用程序的性能将下降。这在web应用程序中尤其明显。对于移动或桌面应用程序,“锁定”绝对是合适的