【问题标题】:Using Static methods or none static methods in Dao Class?在 Dao 类中使用静态方法还是非静态方法?
【发布时间】:2011-02-01 04:50:08
【问题描述】:

您好,我为一些 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(); 
   }
}

【问题讨论】:

    标签: class static dao


    【解决方案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 字段和静态方法,您将遇到多个客户端同时访问此代码的并发问题。您可能会发生非常奇怪的异常,甚至可能一个客户端可以看到另一个客户端的数据。

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-06-17
              • 1970-01-01
              • 2011-01-17
              • 1970-01-01
              • 2017-06-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多