如何从asmx Web Service管理多个ado.net数据库连接

时间:2009-11-25 14:19:16

标签: c# iis ado.net asmx

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

  1. 创建新对象以提供每个请求是否有效? (甚至还有替代品吗?)

  2. 创建新连接是否是线程安全,高效和最佳做法,并为每个请求打开和关闭它,如下所示:

  3. 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();
    }
    

    PS。此示例来自此站点。我使用oracle db。

    谢谢:马蒂

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

正如Darin在his answer中正确陈述的那样,您应该允许连接池机制完成其工作。不要试图建立一些“聪明”的东西,它不会那么好。

数据库连接等资源昂贵的黄金法则是迟到和早发布。只要你遵守,那你就可以做得很好。