Class 在Dao类中使用静态方法还是非静态方法?
嗨,我为一些DB操作生成Dao类 以这种方式使Dao类的方法是静态的还是非静态的更好 使用下面的示例dao类,如果有多个客户机同时使用AddSampleItem方法?这会产生什么结果Class 在Dao类中使用静态方法还是非静态方法?,class,static,dao,Class,Static,Dao,嗨,我为一些DB操作生成Dao类 以这种方式使Dao类的方法是静态的还是非静态的更好 使用下面的示例dao类,如果有多个客户机同时使用AddSampleItem方法?这会产生什么结果 public class SampleDao { static DataAcessor dataAcessor public static void AddSampleItem(object[] params) { dataAcessor =new DataAcessor();
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();
}
}
此代码不是您编写的线程安全的 如果您有dataAccessor字段和静态方法(如下面所示),那么多个客户机同时命中此代码时会出现并发问题。很可能会出现非常奇怪的异常,甚至一个客户端可能会看到另一个客户端的数据
去掉这些方法和这个字段上的static,为每个客户机实例化一个新的SampleDao实例。这将导致一个大混乱。如果您同时从不同的线程添加两个项目,那么如果一个线程在另一个线程完成之前关闭
DataAcessor
,您肯定会得到非常奇怪的结果,甚至会出现错误
我会使用一个本地的DataAcessor
或创建一个新的,并在所有方法中使用它,具体取决于您希望如何管理DataAcessor
的生存期
public class SampleDao
{
public void AddSampleItem(object[] params)
{
DataAcessor dataAcessor =new DataAcessor();
// ...
}
public void UpdateSampleItem(object[] params)
{
DataAcessor dataAcessor =new DataAcessor();
// ...
}
}
我总是喜欢非静态类。依赖项不能注入到静态类中,单元测试更加困难。而且,当它的客户端进行单元测试时,不能用测试双精度替换它
在每个方法中将新的DataAccessor对象分配给静态DataAccessor引用将导致并发问题。您仍然可以在SampleDao类中使用静态方法,但请确保删除对DataAccessor的静态引用。要使用DataAccessor,请创建一个本地实例。这样可以避免并发问题。这里的缺点是每次调用静态方法时,都会创建DataAccessor的实例
大多数情况下dao是无状态的。在这些情况下,我认为在dao中使用非静态方法没有任何意义,因为我们需要创建该dao的实例来访问其方法。Bruno是正确的。不过,您也可以添加一个单线程,并使用“锁”来锁定应用程序的单线程部分。但请记住,请求将排队,如果查询需要时间,应用程序的性能将下降。这在web应用程序中尤其明显。对于移动或桌面应用程序,“锁定”绝对是合适的