如何从asmx Web服务管理多个ado.net数据库连接
问题描述:
由于IIS为每个请求分配了一个工作线程,我打算创建一个新对象来为每个请求提供服务。我有2个问题:如何从asmx Web服务管理多个ado.net数据库连接
是否有效地创建新的对象来为每个请求提供服务? (是甚至有alternatice?)
它是线程安全的,高效的和最佳实践来创建新的连接,并打开&关闭它像下面的每个请求:
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();
}
答
正如达林在his answer正确地指出,你应该允许连接池机制来完成其工作。不要试图建立“聪明”的东西,它不会那么好。
带有昂贵资源(如数据库连接)的黄金法则是尽早购买和发布。只要你遵守,那么你会做得很好。
感谢您的快速回答。听起来不错。但这是最佳做法吗?使用下面的东西怎么样? private static DbProviderFactory factory = DbProviderFactories.GetFactory(“System.Data.SqlClient”); – 2009-11-25 14:34:30
@darin谢谢,这有助于缩短响应时间 – 2016-10-04 13:22:04