C#静态数据库类?

时间:2009-03-12 08:19:13

标签: c# database static data-access-layer data-access

我有一个数据库类,它包含以下方法:

  • public bool ExecuteUDIQuery(string query)// UDI = Update Delete Insert
  • public bool ExecuteSelectQuery(string query)
  • public bool ExecuteSP(string sp,string [,] parms)
  • public int ExecuteSPReturnValue(string sp,string [,] parms)

方法的结果存储在私有数据集或数据表中。这些对象被定义为getter。

大约有10个类使用Database类。每个类都创建一个Database类的对象。现在我正在考虑使Database类保持静态。这是一个好主意吗?如果是这样,为什么?不,为什么不呢?

8 个答案:

答案 0 :(得分:5)

如果我理解,数据库类有一些存储查询结果的属性?如果是这样,则无法使它们成为静态,因为这不是线程安全的。如果查询的结果存储在这些属性中,如果第二个查询在第一个查询之后立即执行会发生什么?它将存储在相同的静态变量中。对于Web应用程序也是如此:浏览站点的另一个用户的结果将改变第一个用户的结果。

编辑:总结一下,当您将查询结果存储在静态变量中时,请不要使该类保持静态,特别是在网站中使用该类时,不要使该属性值,因为属性值将在您网站的所有访问者之间共享。如果20个访问者同时进行查询,则访问者1将看到访问者20的查询结果。

答案 1 :(得分:4)

在您的具体示例中,我建议不要使该类保持静态:您将状态保存在Database类中,并通过使该类静态,该状态将使用您的数据库在所有类之间共享。在当前的设置中,每个数据库实例都保持自己的状态,因此数据库调用相互干扰没有问题。

如果您在进行方法调用时重构Database类以返回数据集,那么您可以将其设置为静态:Database类中不会留下任何有状态信息。

但是因为事实并非如此:不,不要让这个类静止。

答案 2 :(得分:2)

除了其他关于线程安全的评论之外,还存在并行化问题。在您的情况下,您将无法同时打开与数据库的多个连接,并且您将无法执行多个并行查询,即使结果的线程安全性不是问题。

所以我同意其他人的意见,不要用它来制作静态类。

使类静态可能很方便,但创建它的新实例可能不会是一个昂贵的操作,因此可能没有太多可以获得性能。

编辑:
我在评论中看到你想在网站上使用你的课程。在那种情况下,你真的不应该这样做。使用静态数据库类,您只能在任何时间安全地提供一个请求,而这不是您想要的。

答案 3 :(得分:1)

这取决于您使用的数据库或ORM类型。但根据我的经验,这似乎是一个好主意,但结束了我的轴心。以下是它在LINQ-to-SQL中为我做的:

我有一个存储库类,它有一个数据上下文的静态变量。它起初工作,但是当我不得不制作更多的存储库类时,我最终得到了错误,因为我一直在攻击。事实证明,LINQ-to-SQL中的数据上下文缓存了所有结果,并且无法刷新它们。因此,如果您在一个上下文中的表中添加了一个帖子,它将不会显示在缓存该表的其他内容中。解决方案是删除static修饰符并让存储库在构造函数中创建上下文。由于存储库类是在使用时构造的,因此新的数据上下文也是如此。

你可能会认为静态变量在内存中留下的占用空间较少,但数据上下文的占用空间很小,最终会被垃圾收集。

答案 4 :(得分:1)

与答案帖相反。 我已经构建了一个带有静态数据库访问的web框架,它工作得很好并且性能很好。

您可以在http://www.codeplex.com/Cubes

查看源代码

答案 5 :(得分:0)

如果您只是对数据库执行查询,那么将其设为静态。如果此对象需要保持某种状态,则只需创建实例。

答案 6 :(得分:0)

如果您有静态方法,则需要在打开和关闭数据库时跟踪实例。

所以你可能想做的是有一个名为instance或current instance的静态方法。在你的内部创建一个db-class的新实例,在静态方法中返回它。

答案 7 :(得分:0)

您的方法适合静态使用。我想,你现在可以毫不费力地将它们转换为静态方法。

但稍后您可能需要管理交易。将交易管理留给班级可以节省大量时间。这种情况最适合非静态类。