2012-03-21 50 views
7

我不使用LINQ到SQL或實體框架位在一個Web應用程序,並且當前已經使用這樣的事情(這是一類項目):如何在ASP.NET MVC應用程序中維護數據庫連接?

using System.Data; 
using System.Data.SqlClient; 

namespace StackOverflowClone.Models 
{ 
    public class Database 
    { 
     public static SqlConnection ActiveConnection { get; private set; } 

     static Database() 
     { 
      ActiveConnection = new SqlConnection(
       "Data Source=********.database.windows.net;" + 
       "Initial Catalog=EECS341;Uid=*****;Pwd=*******;" + 
       "MultipleActiveResultSets=True;"); 
      ActiveConnection.Open(); 
     } 
    } 
} 

然而,這似乎引起線程問題,因爲靜態初始化器每個服務器進程運行一次,而不是每個請求一次。

該框架是否提供了一種內置的方法來處理這個問題,還是應該每次都有一個新的數據庫連接?

+0

@TomasVoracek:問題是一次可能有多個用戶在服務,並且連接偶爾會感到困惑並且無法查詢,因爲不同的線程仍在讀取先前查詢的結果。 – 2012-03-21 20:04:45

回答

12

或者我應該只是有一個功能,咳嗽每次新數據庫連接?

是的,這樣做。讓ADO.NET connection pooling爲您處理細節。您的目標應該是儘可能在一段時間內保持連接暢通。

連接池減少了必須打開新連接 的次數。共同池持有物理連接的所有權。它通過爲每個給定的連接配置保持一組活動的 連接來管理連接。只要用戶 在連接上調用Open,池就會在池中查找可用的 連接。如果有一個池連接可用,它將 返回給調用者,而不是打開一個新的連接。當 應用程序在連接上調用Close時,池會將其返回到 活動連接的池集,而不是關閉它。一旦 連接返回到池中,它就準備好在 下一次打開呼叫時重新使用。

因此,創建一個返回新的打開連接的靜態方法GetConnection()。在using語句中使用它,以便儘快關閉並返回到連接池。

using(var cn = Database.GetConnection()) 
{ 
    //query your data here, Dapper example below 
    cn.Execute("update MyTable set MyField = @newValue", new {newValue}); 
} 
+0

連接池?那是什麼? – 2012-03-21 19:58:20

+0

@BillyONeal - [連接池](http://en.wikipedia.org/wiki/Connection_pool)。 – Oded 2012-03-21 19:59:19

+2

@BillyONeal:這聽起來像是一個連接池...也許Google知道更多。 – 2012-03-21 20:00:11

4

總是創建新的連接,並與using摧毀他們。它們不是真正從頭開始創建的,它們是從connection pool獲取的。沒有性能損失。其實這是最好和正確的方式。

見我對using答案:https://stackoverflow.com/a/9811911/290343

+0

:嘆:還有另一個層次深入使用運行一個簡單的查詢。我們已經有一個用於SqlCommand,一個用於事務,一個用於讀取器,另一個用於循環讀取記錄。我想如果這是我們必須做的事情,那我們就必須做,但每次做這件事似乎都很痛苦。 – 2012-03-21 20:02:23

+0

@BillyONeal取決於您使用什麼API訪問數據庫。我建議您查看[Dapper](http://www.google.ca/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCsQFjAA&url=http%3A%2F%2Fcode.google.com%2Fp %2Fdapper點網%2F&EI = PjRqT76cMqLf0QGBwozxAQ&USG = AFQjCNHDo-0KnatIhtMQ4pvQ0QLhup59Wg)。非常簡單。 – RedFilter 2012-03-21 20:04:34

+0

@BillyONeal:你可以使用語句進行堆棧...如果我有多個,我可以避免在下一行添加大括號。使它更清潔。 – 2012-03-21 20:04:40

1

該框架是否提供了內置的處理這種或 我應該只是有咳嗽起來,每次new'd了數據庫連接 功能的方法?

兩者其實都是。

Web服務器是多線程的,所以每個線程都需要自己的數據庫連接。只需在需要時創建一個。

合併到數據庫的實際連接。當您處理連接對象時,實際連接不會關閉,但會返回到池中。如果使用相同的連接字符串創建一個新的連接對象,它只會重用池中的連接。

相關問題