從客戶端到服務器再到數據庫的一些思考與疑問

  • 歡迎你們提出本身的疑問點
  • 本人在web應用開發的學習過程當中,以Java語言爲主線,在用戶訪問服務器的過程當中,涉及到的一些細節問題,因此做此文,但願你們可以指點一二。

Web應用架構圖

焦點

  • 本文圍繞HTTP鏈接,併發處理(Java線程池),數據庫鏈接池三方面進行逐一思考和解決,是一個學習的過程,但願獲得你們的解答
重點疑問
  • 主要是思考咱們平時學習的Java併發,爲何在平時開發web應用時,徹底沒有去使用?
  • 是否是Spring體系框架已經內部處理這種併發訪問的鏈接?
  • 那咱們平時學習這些建立線程,線程池的做用在哪裏?爲了面試?
  • 通常咱們都是使用main方法來啓動多線程,學習多線程,可是咱們有沒有思考過,大量的訪問到來時,須要咱們去寫併發來處理這些訪問?咱們是如何讓每一個線程自動去接收這些請求並處理的 ?
  • 這些都是個人疑問,也是寫這個文章的緣由,希望你們可以分享本身的看法
  • 若是沒可以理解個人問題,能夠留言,我會一一完善。

客戶端

  • 一、首先咱們常常在網上看到一些文章,相似名爲《從瀏覽器輸入url到頁面的顯示的全過程》,文章可以爲了闡述整個思路
  • 二、咱們在瀏覽器上輸入url後,會進行DNS解析,再根據IP進行訪問。當有大量的用戶同時訪問同一個站點時,根據HTTP各版本的類型,針對HTTP鏈接有不一樣的進化(HTTP1.0默認使用短鏈接,HTTP使用長鏈接)
  • 三、長鏈接,當一個網頁打開後,客戶端和服務端之間的鏈接不會關閉,保持一個設定的時間,客戶端再次訪問這個服務器時,會繼續使用這個鏈接。

服務器端

Spring框架內置線程池
  • 毋庸置疑,平時咱們寫web應用網站時,都是由於咱們使用了框架,因此纔會感受到一直在寫業務邏輯代碼,學習過的併發從未派上過用場,這是由於框架使併發透明化,「摸不着,看不見」。
  • 對於Spring的系統,通常都分爲Controller,Service,DAO;對於Service,通常會注入DAO,而DAO就回用到數據鏈接Connection,咱們知道Connection是有狀態的,在多線程環境下,確定會遇到問題,Spring爲咱們考慮到了這種狀況,對此作了特殊處理,只要使用Spring提供的線程綁定資源獲取工具獲得的Connection就是線程安全的,JDBC或MyBatis對應DataSourceUtils,Hibernate對應SessionFactoryUtils,從相應的工具類中獲取的Connection,經過了ThreadLocal處理,因此不會出現線程安全問題。另外Spring爲咱們作了更多事情,咱們能夠沒必要本身取獲取Connection,Spring爲咱們提供了DAO模板類,JDBC對應JdbcTemplate,Hibernate對應HibernateTemplate,MyBatis對應SqlMapClientTemplate,直接使用模板進行數據訪問操做徹底不用擔憂線程安全問題(其內部其實也是調用了相應的工具類)。因此咱們的DAO徹底能夠成爲singletion 對象。而後只要使用Spring提供的事務管理,咱們的Service也一樣能夠成爲singletion 對象。而咱們的Controller,若是隻注入了Service,而沒有其餘狀態對象,一樣能夠成爲singletion 對象。固然了,若是還包含其餘有狀態的成員屬性,Spring也是無能爲力的,這時候只能定義爲request或者其餘合適的對象了。(摘抄https://www.oschina.net/question/661185_116863)
  • 配置線程池
<!-- spring thread pool executor -->           
    <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <!-- 線程池維護線程的最少數量 -->
        <property name="corePoolSize" value="5" />
        <!-- 容許的空閒時間 -->
        <property name="keepAliveSeconds" value="200" />
        <!-- 線程池維護線程的最大數量 -->
        <property name="maxPoolSize" value="10" />
        <!-- 緩存隊列 -->
        <property name="queueCapacity" value="20" />
        <!-- 對拒絕task的處理策略 -->
        <property name="rejectedExecutionHandler">
            <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
        </property>
    </bean>
複製代碼
本身搭建一個處理併發訪問的框架??
  • 線索1:咱們平時接觸的tomcat,套接字Socket就是專門接收客戶端請求的,能否從這入手理解?
  • 線索2:利用多線程來實現一個簡單的服務器,來實現處理多個用戶的請求??
  • 線索3:多線程+Socket實現多用戶多功能並行請求的服務端設計
  • 線索4: 多線程阻塞I/O模型
  • 線索5:多線程非阻塞I/O模型

數據庫

  • 數據庫鏈接池druid
  • 鏈接這類知識,無非就是建立和銷燬會消耗大量資源,保持個別鏈接存活,不但節省資源,並且還可以提升性能

總結

  • 這篇文章也許沒什麼乾貨,但它讓個人思考找到了一些解決的思路
    1. 本身動手去實現一個簡單的多線程處理多個用戶請求的服務器
    1. 不斷探索tomcat,Servlet的原理,它是其餘框架,如SpringMVC的鼻祖
    1. 多思考web應用的整個流程,只有打通各個環節,架起一座大廈的框架,其他的事就是不斷地搬磚添瓦。
相關文章
相關標籤/搜索