對於校內網的消息提醒功能的想法 (2)


s之前的文章提到了一些想法,最忠實的是輪詢ajax,每秒鍾發送一次請求。同時,有高手提出了comet,jms等先進方法。只是我看了一些關於這些技術的文章,自己還沒有達到能應用的程度。只是今天午飯的時候,又想到一個土方法。
  為什么在客戶端輪詢請求?本質上依然是在服務器端輪詢訪問數據庫,看有沒有更新。那么,不用在客戶端每隔多長時間發送一次ajax請求,發送了一個ajax請求之后,在服務器端設置定時器,沒多少時間訪問數據庫一次,然后如果有更新,就response。
當然,這個想法有一些問題和一些改進。問題是:ajax請求發送一次后,能維持多長時間?也就是當一直沒有相應的情況下,這個連接能維持多久?可以設置這個時間嗎?如果有時間限制,那么在服務器端就要進行一些改進,就是長時間訪問數據庫而沒有更新的情況下,應當發送一個response相應,通過這個相應,讓客戶端再次發送請求。還有,當有相應到達后,這個連接會不會關閉?如果會關閉,那么有相應過來之后,可以再發送一次請求,至少不需要輪詢請求。而是基於事件的請求。
一些改進:對於同時會達到上千個用戶訪問的應用,如果服務器采用輪詢訪問數據庫,那么會導致一個最壞的情況,在同時間有上千個和數據庫的連接存在。首先,數據庫的連接池的連接數量是有限的,如果用weblogic+oracle,那么weblogic的連接數是40個,oracle連接池的數量是20個。我聽別人這么說的,是一種基於經驗的設置。那么,我可以對這個輪詢進行這樣的該進。我在輪詢的這個循環體里面,每一次訪問數據庫前都要加上一把鎖,這個鎖放在application對象中,是一個int變量,想連接,先檢查鎖變量的值有無超過閾值,超過,則continue,下一次循環,同時,如果沒有達到閾值,那么就先將鎖變量自增,然后再訪問數據庫,訪問結束,再讓鎖變量自減。這樣,我可以控制在同一時間內,在服務器端的數據庫連接數量。而使得其他數據庫操作能正常操作而不會讓oracle莫名停掉。

http是一個無連接的協議,為什么就不能有個http++協議,可以長連接?其實可以啊,發送一個請求,然后服務器就能立即響應一個請求這個過程,其實本身就是一種事件模型啊,把這種機制request-->response放到數據庫服務器和應用服務器這個整體中,也可以啊,只是我不知道現在有沒有哦。我對xml了解很少,但是hibernate的工作過程就是數據庫有變化就能傳遞到對應的java類中啊,所以數據庫服務器和應用服務器的這種事件模型也是可行的啊。

歡迎大家對我的想法進行批判,和建議。謝謝!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com