[英]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.