2010-03-11 48 views
1
  1. 我應該爲每個Apache線程初始化數據庫遊標一次,還是應該在HTTP客戶端可用的每個函數中初始化一個?Web應用程序:保持DB遊標還是重新創建?

  2. 當客戶端終止連接(即用戶關閉瀏覽器選項卡)時會發生什麼?正在處理請求的服務器端函數是否正常繼續,直到它返回,還是立即終止而沒有機會關閉所有事務?

回答

0

光標是昂貴的資源。

一般...

  1. 剛打開它們,當你需要他們。

  2. 只要你完成它們就關閉它們。

遊標每線程可能會不必要地佔用資源。有時你有太多的數據庫活動,每個線程的遊標可能會有更高的性能。這很少見。如果你認爲光標開關正在減慢速度,你需要測量每個函數和每個線程之間的差異,看看實際發生了什麼。

服務器不知道瀏覽器中發生了什麼。零。來自瀏覽器的每個請求都是一個獨立的,獨特的,斷開的事件。

如果瀏覽器「關閉」,那並不意味着什麼。這隻意味着服務器沒有得到任何進一步的請求。

如果服務器試圖下載響應,那麼套接字崩潰,服務器最終停止嘗試。

如果服務器沒有處理任何東西,它仍然沒有處理任何東西。

0
  1. 我想初始化這樣的資源,如數據庫連接或遊標是確定每個線程。一些框架/庫爲此使用線程局部「全局」變量。瞭解數據庫最大客戶端連接限制。是否保持數據庫連接仍然打開,或花費一些時間連接到數據庫的每個請求是由您的決定。它還取決於數據庫服務器每個連接需要多少資源 - AFAIK PostgreSQL爲連接提供新進程(這非常昂貴),而MySQL使用線程。

  2. 這取決於什麼Web服務器運行您的應用程序。如果有人關閉了瀏覽器標籤,你可能會注意到它可能是當你想寫入HTTP響應到套接字 - 它應該引發寫入錯誤或類似的東西。但我可以想象,當檢測到來自客戶端的關閉連接時,配置爲終止進程/線程的Web服務器。但是,當web應用程序立即終止時(例如斷電:)或強制(web)服務器重新啓動,仍然存在一些情況。

  3. 小提示 - 在處理HTTP請求之前,您應該檢查並回滾事務,以防在處理最後一個請求時連接沒有正確回滾時引發異常。 (或者你可以在處理HTTP請求之後執行此操作。)在處理HTTP請求之前,還要檢查數據庫連接是否仍然存在(可能會耗時)。

相關問題