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

14

你好,我生成了一些用于数据库操作的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个回答

15

这样会导致问题复杂化。如果你从不同的线程同时添加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();
      // ...
  }
}

8

4

按照你的写法,这段代码不是线程安全的。

如果你像这样将dataAccessor字段和方法设置为静态的,当多个客户端同时访问该代码时,就会出现并发问题。很可能会出现非常奇怪的异常情况,甚至有可能一个客户端会看到另一个客户端的数据。

取消这些方法和字段上的static属性,并为每个客户端实例化一个新的SampleDao实例。


1
在每个方法中给静态DataAccessor引用赋予新的DataAccessor对象会导致并发问题。您仍然可以在SampleDao类中拥有静态方法,但请确保删除对DataAccessor的静态引用。要使用DataAccessor,请创建一个本地实例。通过这种方式,您可以避免并发问题。这里的缺点是每次调用静态方法时都会创建一个DataAccessor实例。
在大多数情况下,Daos是无状态的。在这些情况下,我认为在Daos中没有非静态方法是没有意义的,因为我们需要创建该dao的实例以访问其方法。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接