使用这个静态类的潜在问题是什么
本文关键字:问题 问题是 是什么 静态类 | 更新日期: 2023-09-27 17:57:46
这是我的示例代码:
public static class MySqlHelper
{
private static string constring = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString;
public static int ExecuteNonQuery(string mysqlquery)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(mysqlquery, conn);
int result;
try
{
conn.Open();
result= cmd.ExecuteNonQuery();
}
finally
{
conn.Close();
}
return result;
}
}
用法:MySqlHelper.ExecuteNonQuery("select * from customers");
我想知道使用这个静态类的问题
我可以像这里提到的那样更改我的课程,但我已经在几个网站上使用了这个课程,我需要几天的时间在每个地方更改并测试它。
感谢您的意见。
编辑:更新了代码。这会对提供的答案产生影响吗?对不起,我一开始就应该发的。
我假设连接字符串在执行过程中不会更改(您可能希望将其设为只读)。由于问题中没有显示其他共享状态,因此不存在真正的问题。
然而,如果您有任何共享状态,那么您就有一个巨大的线程问题。如果您共享了连接,则会遇到更大的问题。
但正如所写的,没有显著的静态字段:没有问题。
我觉得他回答得很清楚。
在ASP.NET 中编写我自己的提供者类
"请记住,所有用户都将在同一个实例中共享连接,这可能会导致严重问题…"
静态类很难测试。
你的问题提到,要想改变,你必须在几个网站上改变课程。如果你的网站与一个接口耦合,那么交换实现将相对简单。
在我自己的项目中,我避免使用公共静态类。它们很快就会变得笨重。
因此,这不成问题,这取决于您如何使用此类,理想情况下,它是抽象工厂模式的一部分,具有静态连接,以便在整个应用程序中使用相同的连接,但具有executerader和其他方法等方法不是一个好选择。类似地,总是检查连接是否未关闭或使用前的状态,因为如果您使用静态连接,并且您使用executereader的语法,则它将关闭连接,如果其他方法在此之后使用连接,则它会得到错误
明显的缺点是:
- 硬编码连接字符串
- 如果驱动程序中没有连接池,这将非常糟糕://open-conn+/close-conn
1) 可以通过使用singleton作为连接字符串名称来丑陋地解决
2) 如果不引入共享数据,就无法在静态类中解决问题:即不在背后插刀子。
你知道MySQL Connector for.NET现在有一个MySqlHelper类吗(你可以在这里的源代码中查看它)?
如果您要走这条路,您可能会考虑使用Microsoft DAAB SqlHelper v2产品。它使用了相同的概念,但更加健壮。它还缓存SqlParameters。该代码大约在2001年问世,一直被许多开发人员使用。
http://www.microsoft.com/download/en/details.aspx?id=435