連接池技術

来源:https://www.cnblogs.com/nykuo/archive/2019/07/09/11158919.html
-Advertisement-
Play Games

連接池技術 連接池技術的核心思想是:連接復用,通過建立一個資料庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復用,避免了資料庫連接頻繁建立、關閉的開銷。另外,由於對JDBC中的原始連接進行了封裝,從而方便了資料庫應用對於連接的使用(特別是對於事務處理),提高了獲取 ...


連接池技術

  連接池技術的核心思想是:連接復用,通過建立一個資料庫連接池以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復用,避免了資料庫連接頻繁建立、關閉的開銷。另外,由於對JDBC中的原始連接進行了封裝,從而方便了資料庫應用對於連接的使用(特別是對於事務處理),提高了獲取資料庫連接效率,也正是因為這個封裝層的存在,隔離了應用的本身的處理邏輯和具體資料庫訪問邏輯,使應用本身的復用成為可能。連接池主要由三部分組成:連接池的建立、連接池中連接的使用管理、連接池的關閉。  

目錄

  1. 接池的建立
  2. 連接池的管理
  3. 連接池的關閉
  4. 連接池的配置
  1. 連接池的關鍵技術
  2. 事務處理
  3. 併發
  1. 多資料庫伺服器
  2. 連接池應用的實現

連接池的建立

應用程式中建立的連接池其實是一個靜態的。所謂靜態連接池是指連接池中的連接在系統初始化時就已分配好,且不能隨意關閉連接。Java中提供了很多容器類可以方便的構建連接池,如:Vector、Stack、Servlet、Bean等,通過讀取連接屬性文件Connections.properties與資料庫實例建立連接。在系統初始化時,根據相應的配置創建連接並放置在連接池中,以便需要使用時能從連接池中獲取,這樣就可以避免連接隨意的建立、關閉造成的開銷。

連接池的管理

連接池管理策略是連接池機制的核心。當連接池建立後,如何對連接池中的連接進行管理,解決好連接池內連接的分配和釋放,對系統的性能有很大的影響。連接的合理分配、釋放可提高連接的復用,降低了系統建立新連接的開銷,同時也加速了用戶的訪問速度。下麵介紹連接池中連接的分配、釋放策略。 連接池的分配、釋放策略對於有效復用連接非常重要,我們採用的方法是一個很有名的設計模式:Reference Counting(引用記數)。該模式在復用資源方面應用的非常廣泛,把該方法運用到對於連接的分配釋放上,為每一個資料庫連接,保留一個引用記數,用來記錄該連接的使用者的個數。具體的實現方法是: 當客戶請求資料庫連接時,首先查看連接池中是否有空閑連接(指當前沒有分配出去的連接)。如果存在空閑連接,則把連接分配給客戶並作相應處理(即標記該連接為正在使用,引用計數加1)。如果沒有空閑連接,則查看當前所開的連接數是不是已經達到maxConn(最大連接數),如果沒達到就重新創建一個連接給請求的客戶;如果達到就按設定的maxWaitTime(最大等待時間)進行等待,如果等待maxWaitTime後仍沒有空閑連接,就拋出無空閑連接的異常給用戶。 當客戶釋放資料庫連接時,先判斷該連接的引用次數是否超過了規定值,如果超過就刪除該連接,並判斷當前連接池內總的連接數是否小於minConn(最小連接數),若小於就將連接池充滿;如果沒超過就將該連接標記為開放狀態,可供再次復用。可以看出正是這套策略保證了資料庫連接的有效復用,避免頻繁地建立、釋放連接所帶來的系統資源開銷。

連接池的關閉

當應用程式退出時,應關閉連接池,此時應把在連接池建立時向資料庫申請的連接對象統一歸還給資料庫(即關閉所有資料庫連接),這與連接池的建立正好是一個相反過程。

連接池的配置

資料庫連接池中到底要放置多少個連接,才能使系統的性能更佳,用minConn和maxConn來限制。minConn是當應用啟動的時候連接池所創建的連接數,如果過大啟動將變慢,但是啟動後響應更快;如果過小啟動加快,但是最初使用的用戶將因為連接池中沒有足夠的連接不可避免的延緩了執行速度。因此應該在開發的過程中設定較小minConn,而在實際應用的中設定較大minConn。maxConn是連接池中的最大連接數,可以通過反覆試驗來確定此飽和點。為此在連接池類ConnectionPool中加入兩個方法getActiveSize()和getOpenSize(),ActiveSize 表示某一時間有多少連接正被使用,OpenSize表示連接池中有多少連接被打開,反映了連接池使用的峰值。將這兩個值在日誌信息中反應出來, minConn的值應該小於平均ActiveSize,而maxConn的值應該在activeSize和OpenSize之間。

連接池的關鍵技術

事務處理

前面討論的是關於使用資料庫連接進行普通的資料庫訪問。對於事務處理,情況就變得比較複雜。因為事務本身要求原則性的保證,此時就要求對於資料庫的操作符合"All-or-Nothing"原則,即要麼全部完成,要麼什麼都不做。如果簡單的採用上述的連接復用的策略,就會發生問題,因為沒有辦法控制屬於同一個事務的多個資料庫操作方法的動作,可能這些資料庫操作是在多個連接上進行的,並且這些連接可能被其他非事務方法復用。Connection本身具有提供了對於事務的支持,可以通過設置Connection的AutoCommit屬性為false,顯式的調用 commit或rollback方法來實現。但是要安全、高效的進行連接復用,就必須提供相應的事務支持機制。方法是:採用顯式的事務支撐方法,每一個事務獨占一個連接。這種方法可以大大降低對於事務處理的複雜性,並且又不會妨礙連接的復用。 連接管理服務提供了顯式的事務開始、結束(commit或rollback)聲明,以及一個事務註冊表,用於登記事務發起者和事務使用的連接的對應關係,通過該表,使用事務的部分和連接管理部分就隔離開,因為該表是在運行時根據實際的調用情況動態生成的。事務使用的連接在該事務運行中不能被覆用。在實現中,用戶標識是通過使用者所在的線程來標識的。後面的所有對於資料庫的訪問都是通過查找該註冊表,使用已經分配的連接來完成的。當事務結束時,從註冊表中刪除相應表項。

併發

為了使連接管理服務有更大的通用性,我們必須要考慮到多線程環境,即併發問題。在一個多線程的環境下,必須要保證連接管理自身數據的一致性和連接內部數據的一致性,在這方面Java提供很好的支持(synchronized關鍵字),這樣就很容易使連接管理成為線程安全的。

多資料庫伺服器

在實際應用中,應用程式常常需要訪問多個不同的資料庫。如何通過同一個連接池訪問不同的資料庫,是應用程式需要解決的一個核心問題。下麵介紹一種解決的途徑: 首先,定義一個資料庫連接池參數的類,定義了資料庫的JDBC驅動程式類名,連接的URL以及用戶名口令等等一些信息,該類是用於初始化連接池的參數: public class ConnectionParam implements Serializable{//各初始化參數的定義} 其次是連接池的工廠類ConnectionFactory,通過該類將一個連接池對象與一個名稱對應起來,使用者通過該名稱就可以獲取指定的連接池對象,實現的主要代碼如下: public class ConnectionFactory{static Hashtable connectionPools = //用來保存數據源名和連接池對象的關係public static DataSource lookup(String dataSourceName) throws NameNotFoundException{//查找名字為dataSourceName的數據源}public static DataSource bind(Stringname, ConnectionParam param) throws Exception=/將名字name與使用param初始化的連接池對象綁定 } public static void unbind(String name) throws NameNotFound Exception{ //將與名字name綁定的連接池對象刪除 }

連接池應用的實現

一個完整的連接池應用包括三個部分:DBConnectionPool類,負責從連接池獲取(或創建)連接、將連接返回給連接池、系統關閉時關閉所有連接釋放所有資源;DBConnectionManager類,負責裝載和註冊JDBC驅動、根據屬性文件中定義的屬性創建DBConnectionPool、跟蹤應用程式對連接池的引用等;應用程式對連接池的使用。 本文實現的資料庫連接池包括一個管理類DBConnectionManager,負責提供與多個連接池對象(DBConnectionPool類)之間的介面。每一個連接池對象管理一組封裝過的JDBC連接對象Conn,封裝過的JDBC連接對象Conn可以被任意數量的Model層的組件共用。 類Conn 的設計很簡單,如下所示: Class Conn { Private java. sgl .Connection con; //資料庫連接對象 Public Boolean inUse ; //是否被使用 Public long lastAccess; //最近一次釋放該連接的時間 Public int useCount; // 被使用次數 } 下麵是實現連接池的主要代碼: // 初始化資料庫連接池 public static synchronized void FastInitPool() throws Exception { try { Class.forName(driver); for (int i=0; i<size; i++) { Connection con = createConnection(); if (con!=null) addConnection(con); } } } // 向連接池對象中添加資料庫連接 private static void addConnection(Connection con) { if (pool==null||pool1==null) { pool=new Vector(size); pool1=new Vector(size); } pool.addElement(con); pool1.addElement("false"); } // 獲取資料庫連接 public static synchronized Connection getConn() throws Exception { Connection conn = null; try { if (driver = null) FastInitPool(); // 獲得一個可用的(空閑的)連接 for (int i = 0; i < pool.size(); i++) { conn = (Connection)pool.elementAt(i); if (pool1.elementAt(i)=="false") { pool1.set(i,"true"); //System.out.println("從連接池中獲取第"+(i+1)+"個空閑連接"); return conn; } } //如果沒有可用連接,且已有連接數小於最大連接數限制,則創建並增加一個新連接到連接池 conn = createConnection(); pool.addElement(conn); pool1.addElement("true"); // System.out.println(" 所有連接都在使用,在連接池中再創建一個新連接"); } catch (Exception e) { System.err.println(e.getMessage()); throw new Exception(e.getMessage()); } return conn; //返回一個有效的新連接 } public Connection getConnection(String strDriver, String strUrl, String strUserName, String strPassWord) throws SQLException{ try{ Class.forName(strDriver); conn = DriverManager.getConnection(strUrl, strUserName, strPassWord); } return conn; }   摘自百度,方便學習使用。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 連接資料庫等基礎操作請自行解決哈,本篇是重點記錄如何改密碼。 一、查詢用戶密碼: 查詢用戶密碼命令: host:允許用戶登錄的ip‘位置'%表示可以遠程; user:當前資料庫的用戶名; authentication_string:用戶密碼(後面有提到此欄位); 二、 設置(或修改)用戶密碼: 預設 ...
  • 本帖參考網站<https://blog.csdn.net/lx318/article/details/82686925>的安裝步驟,並對8.0.16版本的部分安裝問題進行修正 在MySQL 8.0.16版本中安裝可能會出現部分錯誤提示已經不使用“UTF8B3”而是使用了“UTF8B4” #///// ...
  • 二、資料庫設計 資料庫設計是將數據對象轉換為數據表等資料庫對象的過程,是資料庫應用系統開發過程中首要的和基本的內容。 按照規範的設計方法,考慮資料庫及其應用系統開發全過程,將關係資料庫的設計分為六個階段:需求分析、概念結構設計、邏輯結構設計、物理結構設計、資料庫實施和數控運行和維護。其中需求分析的任 ...
  • 之所以會寫下這篇日誌,是因為安裝的過程有點虐心。目前這篇文章是針對windows操作系統上的mysqldb的安裝。安裝python的mysqldb模塊,首先當然是找一些官方的網站去下載:https://pypi.python.org/pypi/MySQL-python。下載後,cmd進入MySQL- ...
  • <1>概念 <2>使用場景 <3>分類 1.default 2.not null 3.unique 4.主鍵約束 5.auto_increment:自增長約束 6.unsigned:無符號約束 7.zerofill:零填充約束 8.外鍵約束 總結:資料庫的約束 ...
  • 摘要: 下文講述sqlserver中,更新腳本中常用if exists關鍵字的用法說明,如下所示: 實驗環境:sql server 2008 R2 一、檢測資料庫是否存在於當前資料庫引擎下 二、檢測數據表是否存在於指定資料庫下 三、檢測存儲過程是否存在的方法 四、臨時表是否存在的方法 五、視圖是否存 ...
  • 1. 基礎知識點圖解 編程語言核心結構:變數、基本語法、分支、迴圈、數組、…… Java面向對象的核心邏輯:OOP、封裝、繼承、多態、介面…… 開發Java SE高級應用程式:異常、集合、I/O、多線程、反射機制、網路編程…… 2. 各種語言對比 3. Java誕生 Sun公司(斯坦福大學網路,不是 ...
  • 寫作於:2019-07-09 關鍵字:1.MySQL、 2.MySQL Workbench、 3.eclipse、 4.JDBC連接測試 1.MySQL 一、資源下載 三步下載: 第一步:選擇安裝程式頁面(https://dev.mysql.com/downloads/installer/) 第二步 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...