Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#静态数据库类?_C#_Database_Static_Data Access Layer_Data Access - Fatal编程技术网

C#静态数据库类?

C#静态数据库类?,c#,database,static,data-access-layer,data-access,C#,Database,Static,Data Access Layer,Data Access,我有一个包含以下方法的数据库类: public bool ExecuteUDIQuery(字符串查询)//UDI=Update Delete Insert public bool ExecuteSelectQuery(字符串查询) 公共bool ExecuteSP(字符串sp,字符串[,]parms) public int ExecuteSPReturnValue(字符串sp,字符串[,]parms) 方法的结果存储在私有数据集或数据表中。这些对象被定义为getter 大约有10个类使用数据

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

  • public bool ExecuteUDIQuery(字符串查询)//UDI=Update Delete Insert
  • public bool ExecuteSelectQuery(字符串查询)
  • 公共bool ExecuteSP(字符串sp,字符串[,]parms)
  • public int ExecuteSPReturnValue(字符串sp,字符串[,]parms)
方法的结果存储在私有数据集或数据表中。这些对象被定义为getter


大约有10个类使用数据库类。每个类都创建类数据库的一个对象。现在我想让数据库类成为静态的。这是个好主意吗?若然,原因为何?当然不是,为什么不呢?

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

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


所以您可能想要做的是使用一个名为instance或current instance的静态方法。并在其中创建一个db类的新实例,以静态方法返回它。

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


编辑:总而言之,当您将查询结果存储在静态变量中时,不要将类设置为静态,尤其是在网站中使用该类时,因为属性值将在网站的所有访问者之间共享。如果20个访问者同时执行一个查询,那么访问者1将看到访问者20的查询结果。

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

如果在执行方法调用时重构数据库类以返回数据集,则可以将其设置为静态:数据库类中不会留下任何状态信息


但事实并非如此:不,不要将类设为静态。

这取决于您使用的是哪种数据库或ORM。但以我的经验来看,这似乎是个好主意,但最终还是欺骗了我。以下是我在LINQ to SQL中的表现:

我有一个repository类,它有一个数据上下文的静态变量。它一开始是有效的,但当我不得不创建更多的存储库类时,我在进行黑客攻击时最终发现了bug。事实证明,LINQtoSQL中的数据上下文会缓存所有结果,并且无法刷新它们。因此,如果您在一个上下文中的表中添加了一个post,它将不会显示在缓存该表的另一个上下文中。解决方案是删除静态修饰符,让存储库在构造函数中创建上下文。由于存储库类是在使用时构造的,因此新的数据上下文也是如此


您可能会争辩说,静态变量在内存中留下的占用空间较小,但数据上下文的占用空间一开始就很小,最终会被垃圾收集。

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

所以我同意其他人的观点,不要把它变成一个静态类

使类成为静态可能很方便,但是创建它的新实例可能不会是一个昂贵的操作,因此在性能方面也可能没有多少好处

编辑:

我在一条评论中看到,你想在网站上使用你的类。那样的话,你真的不应该这么做。使用静态数据库类,您在任何时候都只能安全地为一个请求提供服务,而这不是您想要的。

您的方法适合静态使用。我认为,现在将它们转换为静态方法并不困难


但稍后您可能需要管理事务。我认为,将事务管理留给类可以节省大量时间。这种情况最适合非静态类。

与答案相反。 我构建了一个带有静态数据库访问的webframework,它工作得很好,性能也很好


您可以在

查看源代码,保持“实例”处于打开状态不是一个好主意。您应该尽快关闭与DB的连接。当然,您应该关闭连接。但是,如果您有一个用于访问命令的静态类,那么您可以在其中管理数据库连接。有一个命令关闭读者后,他们完成。我正在建设一个网站。所以,如果我理解正确的话,当有20个访问者,他们都请求一个不同的页面(我的db类是静态的)时,它会出错,对吗?是的,你理解正确。如果类是静态的,则属性将在应用程序之间共享。因此,如果20个访问者执行一个数据库查询,该属性将保存由20号访问者执行的最后一个查询的结果。创建一个facade类,它可以简化对数据库类的访问。