資料庫連接池的原理?連接池使用什麼數據結構實現?實現連接池?

来源:https://www.cnblogs.com/HuiH/archive/2020/03/28/12587608.html
-Advertisement-
Play Games

早期我們怎麼進行資料庫操作呢? 1、原理:一般來說,Java應用程式訪問資料庫的過程是: 載入資料庫驅動程式; 通過jdbc建立資料庫連接; 訪問資料庫,執行SQL語句; 斷開資料庫連接。 2、代碼 1 //查詢所有用戶 2 Public void FindAllUsers(){ 3 //1、裝載s ...


早期我們怎麼進行資料庫操作呢?

1、原理:一般來說,Java應用程式訪問資料庫的過程是:

  • 載入資料庫驅動程式;
  • 通過jdbc建立資料庫連接;
  • 訪問資料庫,執行SQL語句;
  • 斷開資料庫連接。

2、代碼

 1 //查詢所有用戶
 2 Public void FindAllUsers(){
 3     //1、裝載sqlserver驅動對象
 4     DriverManager.registerDriver(new SQLServerDriver());
 5     //2、通過JDBC建立資料庫連接
 6     Connection con = DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer","sa","123");
 7     //3、創建狀態
 8     Statement state = con.createStatement();
 9     //4、查詢資料庫並返回結果
10     ResultSet result = state.executeQuery("select * from users");
11     //5、輸出查詢結果
12     while(result.next()){
13         System.out.println(result.getString("email"));
14     }
15     //6、斷開資料庫連接
16     result.close();
17     state.close();
18     con.close();
19 }

 3、分析

程式開發過程中,存在很多問題:

  首先,每一次web請求都要建立一次資料庫連接。建立連接是一個費時的活動,每次都得花費0.05s~1s的時間,而且系統還要分配記憶體資源。這個時間對於一次或幾次資料庫操作,或許感覺不出系統有多大的開銷。可是對於現在的web應用,尤其是大型電子商務網站,同時有幾百人甚至上千人線上是很正常的事。在這種情況下,頻繁的進行資料庫連接操作勢必占用很多的系統資源,網站的響應速度必定下降,嚴重的甚至會造成伺服器的崩潰。不是危言聳聽,這就是制約某些電子商務網站發展的技術瓶頸問題。

  其次,對於每一次資料庫連接,使用完後都得斷開。否則,如果程式出現異常而未能關閉,將會導致資料庫系統中的記憶體泄露,最終將不得不重啟資料庫。還有,這種開發不能控制被創建的連接對象數,系統資源會被毫無顧忌的分配出去,如連接過多,也可能導致記憶體泄漏,伺服器崩潰。

  通過上面的分析,我們可以看出,“資料庫連接”是一種稀缺的資源,為了保障網站的正常使用,應該對其進行妥善管理,其實我們查詢玩資料庫後,如果不關閉連接,而是暫時存放起來,當別人使用時,把這個連接給他們使用。就避免了一次建立資料庫鏈接和斷開的操作時間消耗。原理如下:

技術演進出來的資料庫連接池

  由上面的分析可以看出,問題的根源就在於對資料庫連接資源的低效管理。我們知道,對於共用資源,有一個著名的設計模式:資源池設計模式。該模式正是為瞭解決資源的頻繁分配、釋放所造成的問題。為解決上述問題,可以採用資料庫連接池技術。資料庫連接池的基本系思想就是為資料庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立資料庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連接池最大連接數來防止系統無盡地與資料庫連接。更為重要的是我們可以通過連接池的管理機制監視資料庫的連接的數量、使用情況,為系統開發、測試及性能調整提供依據。

  我們自己嘗試開發一個連接池,來為上面的查詢業務提供資料庫連接服務:

    1)編寫class實現DataSource介面;

    2)在class的構造器一次性創建10個連接,將連接保存在LinkedList中;

    3)實現getConnection,從LinkedList中返回一個連接;

    4)提供將連接放回連接池中的方法;

1、連接池代碼

 1 Pubic class MyDataSource implements DataSource{
 2     //因為LinkedList是用鏈表實現的,對於增刪實現起來比較容易
 3     LinkedList<Connection> dataSources = new LinkedList<Connection>();
 4     //初始化連接數量
 5     public MyDataSource(){
 6     //問題:每次new MyDataSource都會建立10個連接,可使用單例設計模式解決此問題。
 7         for(int i=0;i<10;i++){
 8             try{
 9                 //1、裝載sqlserver驅動對象
10                 DriverManager.registerDriver(new SQLServerDriver())
11                 //2、通過JDBC建立資料庫連接
12                 Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer","sa","123");
13                 //3、將連接加入連接池中
14                 dataSources.add(con);
15             }catch(Exception e){
16                 e.printStackTrace();
17             }
18         }
19     }
20     public Connection getConnection() throws SQLException{
21         //取出連接池中一個連接
22         final Connection conn = dataSources.removeFirst();//刪除第一個連接返回
23         return conn;
24     }
25     //將連接放回連接池
26     public void releaseConnection(Connection conn){
27         dataSources.add(conn);
28     }
29 }

2、使用連接池重構我們的用戶查詢函數

 1 //查詢所有用戶
 2 Public void FindAllUsers(){
 3     //1、使用連接池建立資料庫連接
 4     MyDataSources dataSources = new MyDataSources();
 5     Connection conn = dataSources.getConnection();
 6     //2、創建狀態
 7     Statement state = con.createStatement();
 8     //3、查詢資料庫並返回結果
 9     ResultSet result =state.executeQuery("select * from users");
10     //4、輸出查詢結果
11     while(result.next()){
12         System.out.println(result.getString("email"));
13     }
14     //5、斷開資料庫連接
15     result.close();
16     state.close();
17     //6、歸還資料庫鏈接給連接池
18     dataSources.releaseConnection(conn);
19 }

 連接池的工作原理:

 連接池的核心思想是連接的復用,通過建立一個資料庫連接池以及一套連接使用、分配和管理策略,使得該連接池中的連接可以得到高效、安全的復用,避免了資料庫連接頻繁簡歷和關閉的開銷。

 連接池的工作原理主要由三部分組成,分別為連接池的建立,連接池中連接的使用管理,連接池的關閉。

 第一、連接池的建立。一般在系統初始化時,連接池會根據系統配置建立,併在池中建立幾個連接對象,以便使用時能從連接池中獲取。Java中提供了很多容器類,可以方便的構建連接池,例如Vector(線程安全類)、linkedlist等。

 第二、連接池的管理。連接池管理策略是連接池機制的核心,連接池內連接的分配和釋放對系統的性能有很大的影響。其策略是:

  當客戶請求資料庫鏈接時,首先查看連接池中是否有空閑連接,如果存在空閑連接,則將連接分配給用戶使用並作相應處理(即標記該連接為正在使用,引用計數加1);如果沒有空閑連接,則查看當前所開的連接數是否已經達到最大連接數,如果沒有達到最大連接數,就重新創建一個連接給請求的用戶;如果達到,就按設定的最大等待時間進行等待,如果超出最大等待時間,則拋出異常給客戶。

  當客戶釋放資料庫連接時,先判斷該連接的引用次數是否超過了規定值,如果超過了就從連接池中刪除該鏈接,並判斷當前連接池內總的連接數是否小於最小連接數,若小於就將連接池充滿;如果沒超過就將該連接標記為開放狀態,可供再次復用。

 第三、連接池的關閉。當應用程式退出時,關閉連接池中所有的連接,釋放連接池相關資源,該過程正好與創建相反。

連接池的主要優點:

  1)減少連接的創建時間。連接池中的連接是已準備好的,可以重覆使用的,獲取後可以直接訪問資料庫,因此減少了連接創建的次數和時間。

  2)更快的系統響應速度。資料庫連接池在初始化過程中,往往已經創建了若幹個資料庫連接置於池中備用。此時連接的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連接,避免了資料庫連接初始化和釋放過程的時間開銷,從而縮減了系統整體響應時間。

  3)統一的連接管理。如果不使用連接池,每次訪問資料庫都需要創建一個連接,這樣系統的穩定性受系統的連接需求影響很大,很容易產生資源浪費和高負載異常。連接池能夠使性能最大化,將資源利用控制在一定的水平之下。連接池能控制池中的連接數量,增強了系統在大量用戶應用時的穩定性。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:由於公司占時沒有運維,出於微服務的需要,Apollo只能先裝在windows 阿裡雲上跑起來,由於環境及網路等問題,在安裝過程中遇到很多坑,算是一個個坑填完後,最終實現。 一. java jdk環境 java jdk 1.8下載地址: https://www.oracle.com/java/t ...
  • 本文只對api介面,header請求參數進行簡單驗證,起到拋磚引玉使用,需要深入驗證,請自行擴展 項目目錄結構如圖 中間件類 using ApiMiddleware.Common.DataEnityModel; using ApiMiddleware.Common.DbContext; using ...
  • 一、引言 按照專用隊列解釋: MachineName\Private$\QueueName,只針對於本機的程式才可以調用的隊列,有些情況下為了安全起見定義為私有隊列。所以剛開始的時候認為,要想訪問遠程消息隊列,只能使用公共隊列。但是後來發現,公共隊列依賴Domain Controller(域控),在 ...
  • 一、打開CMD方式 點擊開始,找到windows系統展開,選擇命令提示符 win鍵+R鍵,在打開的彈框中輸入cmd,點擊確認 選中文件夾,按住shift鍵,點擊滑鼠右鍵,選擇在此處打開Powershell視窗 在資源管理器的地址欄上輸入cmd或者在地址前面加上cmd,按回車鍵 二、常用的DOS命令 ...
  • 段、頁結合:程式員希望用段,物理記憶體希望用頁,所以、、、 從虛擬記憶體中割出一個區域來給這個段,段就有了映射,但是這個虛擬記憶體不能正真的使用,需要把虛擬記憶體再映射一次,這個時候虛擬記憶體中的段分割成固定大小的頁,每一頁再去映射到物理記憶體中 1. 段、頁同時存在 段面向用戶,頁面向硬體 2. 段頁同時存在 ...
  • 1.下載CentOS CentOS下載地址: "https://wiki.centos.org/Download" 這裡選擇本地安裝包,網路安裝包在安裝時需要線上下載資源比較慢 2.安裝VirtualBox VirtualBox是Oracle旗下免費的輕量級虛擬機 VirtualBox下載地址: " ...
  • 我們在使用bash命令時,會經常使用二次tab鍵進行補齊。 例如我們常用的telnet命令,在輸入二次tab鍵時,會列出當前系統配置的所有主機名,供選擇 # 輸入 telnet <Tab> <Tab> [huangcihui:/home/huangcihui] telnet ::1 localhos ...
  • 在InnoDB中,數據存儲在磁碟上,處理數據時需要先將數據從磁碟讀取,再寫到記憶體。InnoDB採用局部性原理載入。 一、局部性原理 從磁碟讀取數據時,不需要一行一行讀取,而是以頁為單位讀取,操作系統中一頁4kb,InnoDB中一頁16kb。 二、InnoDB頁結構 頁是InnoDB管理存儲空間的基本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...