在Dao类中使用静态方法或非静态方法?

时间:2010-03-26 14:05:15

标签: class static dao

您好我为某些数据库操作生成Dao类

以这种方式将Dao类的方法设为静态或非静态更好?

使用下面的示例dao类,moref多个客户端同时使用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 个答案:

答案 0 :(得分:12)

这会导致一团糟。如果您同时从不同的线程添加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();
      // ...
  }
}

答案 1 :(得分:6)

我总是喜欢非静态类。依赖关系不能注入静态类,单元测试更难。此外,它们的客户在进行单元测试时无法用测试双重替换它。

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

答案 2 :(得分:3)

这段代码的编写方式不是线程安全的。

如果你有dataAccessor字段并且这些方法是静态的,那么同时遇到这个代码的多个客户端会遇到并发问题。你可能会发生非常奇怪的异常,甚至可能一个客户端可以看到另一个客户的数据。

摆脱这些方法和此字段的静态,并为每个客户端实例化SampleDao的新实例。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

布鲁诺是对的。但是,你也可以添加一个单例并使用" lock"单线程应用程序的那部分。但请记住,请求会排队,如果您的查询需要时间,您的应用程序的性能会降低。这在Web应用程序中尤为明显。对于移动或桌面应用程序"锁定"绝对合适。