2015-02-24 204 views
0

我需要將WCF Web服務連接到SQL Server數據庫。我只需要使用SQL來訪問數據,不需要LINQ或實體框架。WCF數據庫連接:只有一個數據庫連接

我試圖按照本教程: http://www.c-sharpcorner.com/UploadFile/rohatash/inserting-data-into-database-using-wcf-service/。 SqlConnection類似乎正是我需要使用,但是當我看到這個服務的方法:

public string InsertUserDetails(UserDetails userInfo) 
    { 
     // ... 
     SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=Rajesh;User ID=sa;Password=wintellect"); 
     con.Open(); 
     SqlCommand cmd = new SqlCommand("insert into RegistrationTable(UserName,Password,Country,Email) values(@UserName,@Password,@Country,@Email)", con); 
     cmd.Parameters.AddWithValue("@UserName", userInfo.UserName); 
     cmd.Parameters.AddWithValue("@Password", userInfo.Password); 
     cmd.Parameters.AddWithValue("@Country", userInfo.Country); 
     cmd.Parameters.AddWithValue("@Email", userInfo.Email); 
     int result = cmd.ExecuteNonQuery(); 
     // ... 
    } 

我很擔心,因爲很顯然,數據庫連接將在每個請求創建。

下面的代碼結構的示例中,我想有:

public class Service : IService 
{  
    public Company GetCompany(int key) 
    { 
     // Get existing database connection 
     // SELECT * from companies where c_key=key 
     // Return Company instance 
    } 
} 

我應該使用什麼結構,使用SQL來訪問數據,而不是建立在每個請求一個數據庫連接?我可以讓SqlConnection實例是靜態的嗎?我不明白WCF如何處理這個問題,將創建多少服務實例等。 謝謝你的幫助!

+0

您可以創建靜態:請參閱下面的回答 – 2015-02-24 19:43:41

+0

每次連接都有什麼問題?合併需要照顧管理費用。 – DonBoitnott 2015-02-24 19:44:43

+0

我認爲理想情況下,只要服務處於活動狀態,就應該打開數據庫連接,因爲如果x客戶端同時連接到Web服務,則會創建x個數據庫連接。我對嗎?什麼是共享? @DavidP我想這樣做,我只是想確保這種做法是正確的! – Michael 2015-02-24 19:55:37

回答

4

這是保持連接打開只只要需要一般的最佳實踐。

您可以通過高效管理資源來提高性能。 ADO.NET數據提供程序對象實現IDisposable,允許您使用using statements確保這些對象及其非託管資源(如數據庫連接)得到正確和可預測的發佈。

只要您撥打Dispose()(又調用Close())對象 - 它會將連接釋放回連接池。

現代RDBMS的構建可同時處理成千上萬的連接。作爲開發人員的一部分是確保只在需要時保持連接打開。因此打開你的連接,運行你的SQL,得到你的結果,關閉你的連接。

與此類似

關注的東西:

using (var conn = new SqlConnection(ConnectionString)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = conn.CreateCommand()) 
    { 
      cmd.CommandText = "SELECT * FROM SomeTable"; 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        // DO SOME WORK 
       } 
      } 
    } 
} 
+0

非常感謝您的詳細解釋!這使事情變得非常清楚。 – Michael 2015-02-25 20:48:01

+0

加上一個代碼片斷,我從我的手機回答,這太麻煩了 – Wjdavis5 2015-02-26 02:48:10

0

只要確保每次打開和關閉它。

public class Service : IService 
{  
    private static SQLConnection con; 
    public Company GetCompany(int key) 
    { 
     // Get existing database connection 
     // SELECT * from companies where c_key=key 
     // Return Company instance 
    } 
} 
+3

這是個壞主意。通過使實例處於靜態狀態,WCF服務一次只能處理一個請求。更糟糕的是,你需要實際跟蹤關閉連接;在某處發生錯誤,下一次調用'.Open()'(這是無可指責的)將會爆炸。連接彙集;一個'SqlConnection'不代表一個物理連接,到目前爲止,處理它們的最好辦法是儘可能地限制它們的範圍。 – 2015-02-24 21:55:39

1

連接代碼和指令代碼應該使用using語句,以確保事情得到適當的清理。當您創建初始連接時,池將會啓動。當連接處理後,它將被釋放到池中再次被使用。您可以使用連接字符串控制池的大小。