簡體   English   中英

如何最小化並發數據庫連接?

[英]How to minimize concurrent database connections?

我的托管公司阻止我的網站使用超過15個並發數據庫連接。 但在我的代碼中,我關閉了我打開的每一個連接。 但他們仍然說並發連接太多了。 並建議我解決方案,我應該更改我的網站的源代碼。 因此,請告訴我有關此問題的解決方案? 而且我的網站是動態的,因此將其變成靜態的簡單HTML舊類型是否會有所作為?

還要注意我在沒有解決方案時嘗試了這個,在每個con.open()之前,我添加了con.Close() ,因此打開的任何其他連接都將被關閉。

首先要做的是檢查何時打開連接-看看是否可以將其最小化。 例如,你在不同的連接上做“n + 1”?

如果您只有一台服務器 ,則此處的技術解決方案是一種信號燈-例如,類似以下內容:

someSemaphore.TakeOne();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    someSemaphore.Release();
}

將(假設某些信號量被共享,例如static )確保您只能一次“n”次進入該塊。 在您的情況下,您將創建15個空格的信號量:

static readonly Semaphore someSemaphore = new Semaphore(15,15);

然而! 建議小心:在某些情況下,你可能會遇到死鎖:想象2個線程寫得不好,每個需要9個連接 - 線程A需要7個,線程B需要8個。它們都需要更多 - 而且都不會得到它們。 因此,將WaitOne與超時一起使用很重要:

static void TakeConnection() {
     if(!someSemaphore.TakeOne(3000)) {
         throw new TimeoutException("Unable to reserve connection");
     }
}
static void ReleaseConnection() {
     someSemaphore.Release();
}
...
TakeConnection();
try {
    using(var conn = GetConnection()) {
        ...
    }
} finally {
    ReleaseConnection();
}

也可以將其包裝在IDisposable以使使用更加方便。

改變托管公司。

認真。

除非您經營一個可憐的Little Home Blog。

您可以輕松地同時處理超過15個頁面/請求。 我總是對“逃避連接”持謹慎態度,但我不認為15連接甚至值得一提。 這就像汽車租賃公司抱怨你開車超過15公里 - 這只是一個真正的低限。

在繁忙的網站上,您可以擁有50個,100個甚至200個打開的連接,因為您同時擁有多個請求。

這不是那么明顯,但即使你關心正確地打開和關閉你的連接,你也必須看一些特別的東西。

如果對用於構建連接字符串的文本進行最小的更改,.net將創建一個全新的連接,而不是使用一個已經打開的連接(即使該連接使用了MARS),因此以防萬一,請在以下情況下查找代碼:您正在動態創建連接字符串,而不是使用Web配置中的單個字符串。

我相信SQL連接是合並的。 當你關閉一個時,實際上只是將它返回到連接池。

您可以使用SqlConnection.ClearPool(connection)或SqlConnection.ClearAllPools實際關閉連接,但是這會影響站點的性能。

另外,您可以使用連接字符串參數Pooling = false禁用池。 還有最大池大小(默認為100),您可能需要將其設置為較小的數字。

這一切可能都有效,但我也建議您切換提供商。

如果僅從數據庫中獲取數據,則創建某種緩存並不是很困難。 但是,如果有完整的CRUD,那么更好的解決方案是更改托管服務提供商。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM