我有一个数据库类,它包含以下方法:
方法的结果存储在私有数据集或数据表中。这些对象被定义为getter。
大约有10个类使用Database类。每个类都创建一个Database类的对象。现在我正在考虑使Database类保持静态。这是一个好主意吗?如果是这样,为什么?不,为什么不呢?
答案 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框架,它工作得很好并且性能很好。
查看源代码答案 5 :(得分:0)
如果您只是对数据库执行查询,那么将其设为静态。如果此对象需要保持某种状态,则只需创建实例。
答案 6 :(得分:0)
如果您有静态方法,则需要在打开和关闭数据库时跟踪实例。
所以你可能想做的是有一个名为instance或current instance的静态方法。在你的内部创建一个db-class的新实例,在静态方法中返回它。
答案 7 :(得分:0)
您的方法适合静态使用。我想,你现在可以毫不费力地将它们转换为静态方法。
但稍后您可能需要管理交易。将交易管理留给班级可以节省大量时间。这种情况最适合非静态类。