2013-06-30 45 views
1

我被分配來實現一個應用程序(使用C++)來評估待處理的提交(提交是針對給定問題的編程算法)。一個站點(在ASP.NET MVC中)發佈問題並允許用戶提交他們的答案,然後將提交內容標記爲數據庫(SQL Server 2008R2)上的「待評估」,即我的工作開始時:DB的長時間連接或按需連接?

我將有3個(或更多)我的應用程序作爲服務運行。 每個實例必須每2秒檢查一次數據庫中是否存在未決提交。 如果它存在,我檢索並編譯它,成功編譯後執行它,最後在執行後檢查答案的正確性。然後我更新提交設置結果並從待處理表中刪除它。 我需要在數據庫中指定待處理提交(編譯,運行,判斷)的當前狀態。

評估一個子協議的時間是〜(1-3)s,同一個實例永遠不會同時評估更多的一個提交。

我的問題是:如何連接到數據庫服務器? 我有3個可能的解決方案,我需要知道什麼應該更好(爲了提高效率),爲什麼: 1 - 建立一個連接到數據庫,一旦我實例化應用程序,永遠不會關閉它(關閉它,當我刪除實例或關閉服務器,理論上永遠不會發生。) 2 - 爲了獲得待定提交(如果存在),等待完整評估過程結束,設置評估結果並然後關閉連接。 3 - 與2相同,但在檢索提交時關閉連接,編譯完成時再次打開並更新待處理提交的狀態,關閉它,執行完成時再次打開並更新待處理提交的狀態,關閉它最後在評審結束時打開並設置評估結果。

+0

根據池的需求,如果你可以做到這一點。使您的代碼更清潔 –

+0

從技術上講,出於性能原因,您的連接應該是長期存在的。這就是說,這是一個基礎設施層問題,應該使用連接池來處理。 (如果我閱讀文檔,ODBC似乎有一個內置的權限:http://msdn.microsoft.com/en-us/library/ms716319.aspx)您的應用程序代碼本身應該只保留在連接上因爲它需要完成交易。 (就你而言,提交的單一狀態轉換。) – millimoose

回答

1

你不說你正在使用哪個數據庫訪問庫(ODBC,ado.net,other?)。打開和關閉數據庫連接是一項相對昂貴的操作。您應該在您的數據庫訪問框架中使用某種連接池方案。連接池打開一段時間,當您的應用程序打開連接時,它將從池中獲得一個已經打開的連接。這將使它更有效率。去看看connection pooling SQL Server的