2009-11-25 48 views
3

由於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數據庫。

感謝:馬蒂

回答

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

感謝您的快速回答。聽起來不錯。但這是最佳做法嗎?使用下面的東西怎麼樣? private static DbProviderFactory factory = DbProviderFactories.GetFactory(「System.Data.SqlClient」); – 2009-11-25 14:34:30

+0

@darin謝謝,這有助於縮短響應時間 – 2016-10-04 13:22:04

0

正如達林在his answer正確地指出,你應該允許連接池機制來完成其工作。不要試圖建立「聰明」的東西,它不會那麼好。

帶有昂貴資源(如數據庫連接)的黃金法則是儘早購買和發佈。只要你遵守,那麼你會做得很好。