2010-03-26 188 views
10

您好我为某些DB操作生成Dao类在Dao类中使用静态方法或非静态方法?

以这种方式将Dao类的方法设置为static或none static更好吗?

使用下面的示例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(); 
    } 
} 

回答

9

这会导致一个大混乱。如果你从不同的线程同时添加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

这段代码并不是线程安全的。

如果您有dataAccessor字段且方法是静态的,您将遇到多个客户端同时触发此代码的并发问题。很可能会出现非常奇怪的异常,甚至有可能一个客户端可能会看到另一个客户端的数据。

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

0

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

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

0

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

相关问题