您好我为某些数据库操作生成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();
}
}
答案 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应用程序中尤为明显。对于移动或桌面应用程序"锁定"绝对合适。