本系列文章将整理到我在GitHub上的《Java面試指南》倉庫,更多精彩内容請到我的倉庫裡檢視
https://github.com/h2pl/Java-Tutorial
喜歡的話麻煩點下Star哈
文章首發于我的個人部落格:
www.how2playlife.com
本文是微信公衆号【Java技術江湖】的《走進JavaWeb技術世界》其中一篇,本文部分内容來源于網絡,為了把本文主題講得清晰透徹,也整合了很多我認為不錯的技術部落格内容,引用其中了一些比較好的部落格文章,如有侵權,請聯系作者。
該系列博文會告訴你如何從入門到進階,從servlet到架構,從ssm再到SpringBoot,一步步地學習JavaWeb基礎知識,并上手進行實戰,接着了解JavaWeb項目中經常要使用的技術群組件,包括日志元件、Maven、Junit,等等内容,以便讓你更完整地了解整個Java Web技術體系,形成自己的知識架構。為了更好地總結和檢驗你的學習成果,本系列文章也會提供每個知識點對應的面試題以及參考答案。
如果對本系列文章有什麼建議,或者是有什麼疑問的話,也可以關注公衆号【Java技術江湖】聯系作者,歡迎你參與本系列博文的創作和修訂。
JDBC資料庫連接配接池
談談連接配接池、線程池技術原理
做網際網路研發,最早接觸使用jdbc技術,為了資料庫連接配接能夠複用,會用到c3p0、dbcp等資料庫連接配接池。應該是研發人員最早接觸的資料庫連接配接池,再到httpclient http連接配接池,再到微服務netty連接配接池,redis用戶端連接配接池,以及jdk中線程池技術。
這麼多資料庫、http、netty連接配接池,jdk線程池,本質上都是連接配接池技術,連接配接池技術核心是連接配接或者說建立的資源複用。
連接配接池技術核心:通過減少對于連接配接建立、關閉來提升性能。用于使用者後續使用,好處是後續使用不用在建立連接配接以及線程,因為這些都需要相關很多檔案、連接配接資源、作業系統核心資源支援來完成建構,會消耗大量資源,并且建立、關閉會消耗應用程式大量性能。
網絡連接配接本身會消耗大量核心資源,在linux系統下,網絡連接配接建立本身tcp/ip協定棧在核心裡面,連接配接建立關閉會消耗大量檔案句柄(linux中萬物皆檔案,一種厲害抽象手段)系統資源。當下更多是應用tcp技術完成網絡傳輸,反複打開關閉,需要作業系統維護大量tcp協定棧狀态。
連接配接池本質上是建構一個容器,容器來存儲建立好的線程、http連接配接、資料庫連接配接、netty連接配接等。對于使用方相當于黑盒,按照接口進行使用就可以了。各個連接配接池建構、使用管理詳細過程大概分成以下三部分。
第一部分:首先初始化連接配接池,根據設定相應參數,連接配接池大小、核心線程數、核心連接配接數等參數,初始化建立資料庫、http、netty連接配接以及jdk線程。
第二部分:連接配接池使用,前邊初始化好的連接配接池、線程池,直接從連接配接池、線程中取出資源即可進行使用,使用完後要記得交還連接配接池、線程池,通過池容器來對資源進行管理。
第三部分:對于連接配接池維護,連接配接池、線程池來維護連接配接、線程狀态,不可用連接配接、線程進行銷毀,正在使用連接配接、線程進行狀态标注,連接配接、線程不夠後并且少于設定最大連接配接、線程數,要進行新連接配接、線程建立。
通過上邊可以了解到各種連接配接池技術以及線程池原理或者說套路,了解原理才能不被紛繁複雜表象掩蓋。
下面談談建構自己連接配接池,其實了解了連接配接池、線程原理,可以使用ArrayList來建構自己連接配接池、線程池。初始化時建立配置連接配接數、線程,存儲在ArrayList容器中,使用時從ArrayList從取出連接配接、線程進行使用,執行完任務後,送出回ArrayList容器。前提條件是單線程,在多線程狀态下要用線程安全容器。
前邊根據原理介紹了一個簡單連接配接池、線程池怎樣建構,實際工業級别線程池還要考慮到連接配接狀态,短連接配接重連,線程池維護管理高效,線程池穩定等多個因素。
需要用到連接配接池而又沒有相關開源産品可用時,java連接配接池可以使用common-pool2來建構,比如google開源gRPC技術,本身是高性能跨平台技術,但目前作為微服務使用,沒有連接配接池、負載均衡等相應配套,這時可以根據需要自己基于Java容器建構自己連接配接池。也可以利用common-pool2建構連接配接池來提升應用性能,以及保持高可用。common-pool2本身不僅僅可以建構連接配接池使用,還可以用來建構對象池。
連接配接池還有一個副作用就是實作了高可用,在微服務場景下一個連接配接不可用,那麼再從netty連接配接池中取出一個進行使用,避免了連接配接不可用問題。
掌握原理從比較全面掌握各種池技術,避免資料庫連接配接池,再到httpclient http連接配接池,再到微服務netty連接配接池,redis用戶端連接配接池,以及jdk中線程池,對象池各種各樣池技術,使我們眼花缭亂,花費過多時間,掌握原理機制以不變應萬變。
推廣一下這個方法,其他技術也是類似,深入掌握其原理,就可以明白其他類似技術相似原理,避免疲于應對各種新技術。但每一種架構設計與實作又與領域有着關系,也不可講原理不顧實際情況擴充。理論與架構設計、源碼學習相結合才是最好的,希望有幫助。
JDBC 資料庫連接配接池
轉自:
什麼情況下使用連接配接池?
對于一個簡單的資料庫應用,由于對于資料庫的通路不是很頻繁。這時可以簡單地在需要通路資料庫時,就新建立一個連接配接,用完後就關閉它,這樣做也不會帶來什麼明顯的性能上的開銷。但是對于一個複雜的資料庫應用,情況就完全不同了。頻繁的建立、關閉連接配接,會極大的減低系統的性能,因為對于連接配接的使用成了系統性能的瓶頸。
使用連接配接池的好處
- 連接配接複用。通過建立一個資料庫連接配接池以及一套連接配接使用管理政策,使得一個資料庫連接配接可以得到高效、安全的複用,避免了資料庫連接配接頻繁建立、關閉的開銷。
- 對于共享資源,有一個很著名的設計模式:資源池。該模式正是為了解決資源頻繁配置設定、釋放所造成的問題的。把該模式應用到資料庫連接配接管理領域,就是建立一個資料庫連接配接池,提供一套高效的連接配接配置設定、使用政策,最終目标是實作連接配接的高效、安全的複用。
連接配接池的實作
資料庫連接配接池的基本原理是在内部對象池中維護一定數量的資料庫連接配接,并對外暴露資料庫連接配接擷取和傳回方法。
外部使用者可通過 getConnection 方法擷取連接配接,使用完畢後再通過 close 方法将連接配接傳回,注意此時連接配接并沒有關閉,而是由連接配接池管理器回收,并為下一次使用做好準備。
Java 中有一個 DataSource 接口, 資料庫連接配接池就是 DataSource 的一個實作
常用資料庫連接配接池
一、JDBC資料庫連接配接池的必要性
在使用開發基于資料庫的web程式時,傳統的模式基本是按以下步驟:
①在主程式(如servlet、beans)中建立資料庫連接配接。
②進行sql操作
③斷開資料庫連接配接。
這種模式開發,存在的問題:
①普通的JDBC資料庫連接配接使用 DriverManager 來擷取,每次向資料庫建立連接配接的時候都要将 Connection 加載到記憶體中,再驗證使用者名和密碼(得花費0.05s~1s的時間)。需要資料庫連接配接的時候,就向資料庫要求一個,執行完成後再斷開連接配接。這樣的方式将會消耗大量的資源和時間。資料庫的連接配接資源并沒有得到很好的重複利用.若同時有幾百人甚至幾千人線上,頻繁的進行資料庫連接配接操作将占用很多的系統資源,嚴重的甚至會造成伺服器的崩潰。
②對于每一次資料庫連接配接,使用完後都得斷開。否則,如果程式出現異常而未能關閉,将會導緻資料庫系統中的記憶體洩漏,最終将導緻重新開機資料庫。
③這種開發不能控制被建立的連接配接對象數,系統資源會被毫無顧及的配置設定出去,如連接配接過多,也可能導緻記憶體洩漏,伺服器崩潰。
二、資料庫連接配接池(connection pool)
資料庫連接配接池簡單介紹
為解決傳統開發中的資料庫連接配接問題,可以采用資料庫連接配接池技術。
資料庫連接配接池的基本思想就是為資料庫連接配接建立一個“緩沖池”。預先在緩沖池中放入一定數量的連接配接,當需要建立資料庫連接配接時,隻需從“緩沖池”中取出一個,使用完畢之後再放回去。
資料庫連接配接池負責配置設定、管理和釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不是重建立立一個。
資料庫連接配接池在初始化時将建立一定數量的資料庫連接配接放到連接配接池中,這些資料庫連接配接的數量是由最小資料庫連接配接數來設定的。無論這些資料庫連接配接是否被使用,連接配接池都将一直保證至少擁有這麼多的連接配接數量。連接配接池的最大資料庫連接配接數量限定了這個連接配接池能占有的最大連接配接數,當應用程式向連接配接池請求的連接配接數超過最大連接配接數量時,這些請求将被加入到等待隊列中。

資料庫連接配接池工作原理:
資料庫連接配接池技術的優點
資源重用:
①由于資料庫連接配接得以重用,避免了頻繁建立,釋放連接配接引起的大量性能開銷。在減少系統消耗的基礎上,另一方面也增加了系統運作環境的平穩性。
更快的系統反應速度:
資料庫連接配接池在初始化過程中,往往已經建立了若幹資料庫連接配接置于連接配接池中備用。此時連接配接的初始化工作均已完成。對于業務請求處理而言,直接利用現有可用連接配接,避免了資料庫連接配接初始化和釋放過程的時間開銷,進而減少了系統的響應時間
新的資源配置設定手段:
對于多應用共享同一資料庫的系統而言,可在應用層通過資料庫連接配接池的配置,實作某一應用最大可用資料庫連接配接數的限制,避免某一應用獨占所有的資料庫資源
統一的連接配接管理,避免資料庫連接配接洩露:
在較為完善的資料庫連接配接池實作中,可根據預先的占用逾時設定,強制回收被占用連接配接,進而避免了正常資料庫連接配接操作中可能出現的資源洩露
三、兩種開源的資料庫連接配接池
JDBC 的資料庫連接配接池使用 javax.sql.DataSource 來表示,DataSource 隻是一個接口,該接口通常由伺服器(Weblogic, WebSphere, Tomcat)提供實作,也有一些開源組織提供實作:
①DBCP 資料庫連接配接池
②C3P0 資料庫連接配接池
DataSource 通常被稱為資料源,它包含連接配接池和連接配接池管理兩個部分,習慣上也經常把 DataSource稱為連接配接池
資料源和資料庫連接配接不同,資料源無需建立多個,它是産生資料庫連接配接的工廠,是以整個應用隻需要一個資料源即可。
當資料庫通路結束後,程式還是像以前一樣關閉資料庫連接配接:conn.close(); 但上面的代碼并沒有關閉資料庫的實體連接配接,它僅僅把資料庫連接配接釋放,歸還給了資料庫連接配接池。
參考文章
https://blog.csdn.net/u010028461/article/details/78932109 https://www.cnblogs.com/shaoxiaohuan/p/7755953.html https://www.cnblogs.com/albertrui/p/8421791.html https://blog.csdn.net/weixin_43124134/article/details/82586062 https://www.jianshu.com/p/0737ac60c7df微信公衆号
個人公衆号:程式員黃小斜
微信公衆号【程式員黃小斜】新生代青年聚集地,程式員成長充電站。作者黃小斜,職業是阿裡程式員,身份是斜杠青年,希望和更多的程式員交朋友,一起進步和成長!專注于分享技術、面試、職場等成長幹貨,這一次,我們一起出發。
關注公衆号後回複“2020”領取我這兩年整理的學習資料,涵蓋自學程式設計、求職面試、算法刷題、Java技術學習、計算機基礎和考研等8000G資料合集。
技術公衆号:Java技術江湖
微信公衆号【Java技術江湖】一位阿裡 Java 工程師的技術小站,專注于 Java 相關技術:SSM、SpringBoot、MySQL、分布式、中間件、叢集、Linux、網絡、多線程,偶爾講點Docker、ELK,同時也分享技術幹貨和學習經驗,緻力于Java全棧開發!
關注公衆号後回複“PDF”即可領取200+頁的《Java工程師面試指南》強烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點。