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

问题描述:

由于IIS为每个请求分配了一个工作线程,我打算创建一个新对象来为每个请求提供服务。我有2个问题:如何从asmx Web服务管理多个ado.net数据库连接

  1. 是否有效地创建新的对象来为每个请求提供服务? (是甚至有alternatice?)

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

PS。这个例子来自这个网站。我使用oracle数据库。

感谢:马蒂

当你做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(); 
} 
+0

感谢您的快速回答。听起来不错。但这是最佳做法吗?使用下面的东西怎么样? private static DbProviderFactory factory = DbProviderFactories.GetFactory(“System.Data.SqlClient”); – 2009-11-25 14:34:30

+0

@darin谢谢,这有助于缩短响应时间 – 2016-10-04 13:22:04

正如达林在his answer正确地指出,你应该允许连接池机制来完成其工作。不要试图建立“聪明”的东西,它不会那么好。

带有昂贵资源(如数据库连接)的黄金法则是尽早购买和发布。只要你遵守,那么你会做得很好。