代码之家  ›  专栏  ›  技术社区  ›  dankyy1

在DAO类中使用静态方法还是不使用静态方法?

  •  13
  • dankyy1  · 技术社区  · 15 年前

    嗨,我为一些数据库操作生成了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(); 
       }
    }
    
    5 回复  |  直到 7 年前
        1
  •  12
  •   Daddy32 derio    9 年前

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

    我会用本地的 数据管理员 或者创建一个新的并在所有方法中使用它,这取决于您希望如何管理 小精灵 .

    public class SampleDao
    {
      public void AddSampleItem(object[] params)
      {
          DataAcessor dataAcessor =new DataAcessor();
          // ...
      }
    
      public void UpdateSampleItem(object[] params)
      {
          DataAcessor dataAcessor =new DataAcessor();
          // ...
      }
    }
    
        2
  •  6
  •   bloparod    15 年前

    我总是喜欢非静态类。依赖项不能注入到静态类中,单元测试更加困难。而且,当对其进行单元测试时,其客户机不能将其替换为test double。

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

        3
  •  3
  •   Derick Bailey    15 年前

    这段代码不像你写的那样是线程安全的。

    如果dataaccessor字段和方法是静态的,那么多个客户机同时命中这段代码时会出现并发问题。很可能会出现非常奇怪的异常,甚至可能一个客户机看到另一个客户机的数据。

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

        4
  •  0
  •   MVJ    10 年前

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

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

        5
  •  0
  •   Mike Lopez    7 年前

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