如何从asmx Web服务管理多个ADO.NET数据库连接

3

因为IIS为每个请求分配一个工作线程,所以我打算为每个请求创建一个新对象来提供服务。我有两个问题:

  1. 创建新对象来为每个请求提供服务是否高效?(是否有其他选择?)

  2. 为每个请求创建新的连接并打开&关闭它是否线程安全、高效且最佳实践,如下所示:

using (MySqlConnection conn = new MySqlConnection(ConfigurationManager.ConnectionStrings["MySqlConnectionString"].ConnectionString))
{ 
    conn.Open();
    MySqlCommand cmd = new MySqlCommand("SELECT password FROM Admin WHERE username='" + username + "'", conn);
    object dbp = cmd.ExecuteScalar();
    conn.Close();
}

注意:此示例取自该网站。我使用Oracle数据库。

谢谢:Matti

2个回答

8

当你执行new SomeSqlConnection()时,实际上并不是每次都创建一个新连接。由于数据库连接的创建成本很高,ADO.NET 会保留一个连接池,并从中获取连接。你还可以删除对Close方法的调用。以下是您可以在每个请求中安全使用的代码片段:

var connectionString = ConfigurationManager.ConnectionStrings["MySqlConnectionString"].ConnectionString;
using (var conn = new MySqlConnection(connectionString))
using (var cmd = conn.CreateCommand())
{ 
    conn.Open();
    cmd.CommandText = "SELECT count(*) from some_table";
    object result = cmd.ExecuteScalar();
}

谢谢您的快速回答。听起来不错。但这是最佳实践吗?使用类似下面的东西怎么样?private static DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient"); - char m
@darin 谢谢,这有助于减少响应时间。 - Khairy Abd El-Zaher

0

正如Darin在他的回答中正确指出的那样,您应该允许连接池机制发挥作用。不要试图构建什么“聪明”的东西,它不会像你想象的那样好。

对于诸如数据库连接之类的昂贵资源,黄金法则是尽可能晚地获取并尽早释放。只要您遵守这个原则,就会做得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接