成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)庫連接池

olle / 1096人閱讀

摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。

一、數(shù)據(jù)庫連接池的原理 基本原理

對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時可以簡單地在需要訪問數(shù)據(jù)庫時,就新創(chuàng)建一個連接,用完后就關(guān)閉它,這樣做也不會帶來什么明顯的性能上的開銷。但是對于一個復(fù)雜的數(shù)據(jù)庫應(yīng)用,情況就完全不同了。頻繁的建立、關(guān)閉連接,會極大的減低系統(tǒng)的性能,因為對于連接的使用成了系統(tǒng)性能的瓶頸。

連接復(fù)用。通過建立一個數(shù)據(jù)庫連接池以及一套連接使用管理策略,使得一個數(shù)據(jù)庫連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。

對于共享資源,有一個很著名的設(shè)計模式:資源池。該模式正是為了解決資源頻繁分配、釋放所造成的問題的。把該模式應(yīng)用到數(shù)據(jù)庫連接管理領(lǐng)域,就是建立一個數(shù)據(jù)庫連接池,提供一套高效的連接分配、使用策略,最終目標是實現(xiàn)連接的高效、安全的復(fù)用。

數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。如:

外部使用者可通過getConnection 方法獲取連接,使用完畢后再通過releaseConnection 方法將連接返回,注意此時連接并沒有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準備。

數(shù)據(jù)庫連接池技術(shù)帶來的優(yōu)勢:
1. 資源重用

由于數(shù)據(jù)庫連接得到重用,避免了頻繁創(chuàng)建、釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增進了系統(tǒng)運行環(huán)境的平穩(wěn)性(減少內(nèi)存碎片以及數(shù)據(jù)庫臨時進程/線程的數(shù)量)。

2. 更快的系統(tǒng)響應(yīng)速度

數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于池中備用。此時連接的初始化工作均已完成。對于業(yè)務(wù)請求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時間開銷,從而縮減了系統(tǒng)整體響應(yīng)時間。

3. 新的資源分配手段

對于多應(yīng)用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應(yīng)用層通過數(shù)據(jù)庫連接的配置,實現(xiàn)數(shù)據(jù)庫連接池技術(shù),幾年錢也許還是個新鮮話題,對于目前的業(yè)務(wù)系統(tǒng)而言,如果設(shè)計中還沒有考慮到連接池的應(yīng)用,那么…….快在設(shè)計文檔中加上這部分的內(nèi)容吧。某一應(yīng)用最大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應(yīng)用獨占所有數(shù)據(jù)庫資源。

4. 統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏

在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄漏。

二、一個最小化的數(shù)據(jù)庫連接池實現(xiàn) 1.前言

數(shù)據(jù)庫應(yīng)用,在許多軟件系統(tǒng)中經(jīng)常用到,是開發(fā)中大型系統(tǒng)不可缺少的輔助。但如果對數(shù)據(jù)庫資源沒有很好地管理(如:沒有及時回收數(shù)據(jù)庫的游標(ResultSet)、Statement、連接 (Connection)等資源),往往會直接導(dǎo)致系統(tǒng)的穩(wěn)定。這類不穩(wěn)定因素,不單單由數(shù)據(jù)庫或者系統(tǒng)本身一方引起,只有系統(tǒng)正式使用后,隨著流量、用戶的增加,才會逐步顯露。
在基于Java開發(fā)的系統(tǒng)中,JDBC是程序員和數(shù)據(jù)庫打交道的主要途徑,提供了完備的數(shù)據(jù)庫操作方法接口。但考慮到規(guī)范的適用性,JDBC只提供了最直接的數(shù)據(jù)庫操作規(guī)范,對數(shù)據(jù)庫資源管理,如:對物理連接的管理及緩沖,期望第三方應(yīng)用服務(wù)器(Application Server)的提供。
本文,以JDBC規(guī)范為基礎(chǔ),介紹相關(guān)的數(shù)據(jù)庫連接池機制,并就如果以簡單的方式,實現(xiàn)有效地管理數(shù)據(jù)庫資源介紹相關(guān)實現(xiàn)技術(shù)。

2.連接池技術(shù)背景 2.1 JDBC

JDBC是一個規(guī)范,遵循JDBC接口規(guī)范,各個數(shù)據(jù)庫廠家各自實現(xiàn)自己的驅(qū)動程序(Driver),如下圖所示:

數(shù)據(jù)庫連接池的實現(xiàn)及原理
應(yīng)用在獲取數(shù)據(jù)庫連接時,需要以URL的方式指定是那種類型的Driver,在獲得特定的連接后,可按照固定的接口操作不同類型的數(shù)據(jù)庫,如: 分別獲取Statement、執(zhí)行SQL獲得ResultSet等,如下面的例子 :

import java.sql.*;

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection dbConn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","username","password");
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery("select * from demo_table");

…some data source operation in here

rs.close();
st.close();
dbConn.close();

在完成數(shù)據(jù)操作后,還一定要關(guān)閉所有涉及到的數(shù)據(jù)庫資源。這雖然對應(yīng)用程序的邏輯沒有任何影響,但是關(guān)鍵的操作。上面是個簡單的例子,如果攙和眾多的if-else、exception,資源的管理也難免百密一疏。如同C中的內(nèi)存泄漏問題,Java系統(tǒng)也同樣會面臨崩潰的惡運。所以數(shù)據(jù)庫資源的管理依賴于應(yīng)用系統(tǒng)本身,是不安全、不穩(wěn)定的一種隱患。

2.2 JDBC連接池

在標準JDBC對應(yīng)用的接口中,并沒有提供資源的管理方法。所以,缺省的資源管理由應(yīng)用自己負責(zé)。雖然在JDBC規(guī)范中,多次提及資源的關(guān)閉/回收及其他的合理運用。但最穩(wěn)妥的方式,還是為應(yīng)用提供有效的管理手段。所以,JDBC為第三方應(yīng)用服務(wù)器(Application Server)提供了一個由數(shù)據(jù)庫廠家實現(xiàn)的管理標準接口:連接緩沖(connection pooling)。引入了連接池( Connection Pool )的概念 ,也就是以緩沖池的機制管理數(shù)據(jù)庫的資源。

JDBC最常用的資源有三類:
— Connection: 數(shù)據(jù)庫連接。
— Statement: 會話聲明。
— ResultSet: 結(jié)果集游標。

分別存在以下的關(guān)系 :

數(shù)據(jù)庫連接池的實現(xiàn)及原理
這是一種“爺—父—子”的關(guān)系,對Connection的管理,就是對數(shù)據(jù)庫資源的管理。舉個例子: 如果想確定某個數(shù)據(jù)庫連接(Connection)是否超時,則需要確定其(所有的)子Statement是否超時,同樣,需要確定所有相關(guān)的 ResultSet是否超時;在關(guān)閉Connection前,需要關(guān)閉所有相關(guān)的Statement和ResultSet。
因此,連接池(Connection Pool)所起到的作用,不僅僅簡單地管理Connection,還涉及到 Statement和ResultSet。

2.3 連接池(ConnectionPool)與資源管理

ConnectionPool以緩沖池的機制,在一定數(shù)量上限范圍內(nèi),控制管理Connection,Statement和ResultSet。任何數(shù)據(jù)庫的資源是有限的,如果被耗盡,則無法獲得更多的數(shù)據(jù)服務(wù)。
在大多數(shù)情況下,資源的耗盡不是由于應(yīng)用的正常負載過高,而是程序原因。
在實際工作中,數(shù)據(jù)資源往往是瓶頸資源,不同的應(yīng)用都會訪問同一數(shù)據(jù)源。其中某個應(yīng)用耗盡了數(shù)據(jù)庫資源后,意味其他的應(yīng)用也無法正常運行。因此,ConnectionPool的第一個任務(wù)是限制:每個應(yīng)用或系統(tǒng)可以擁有的最大資源。也就是確定連接池的大小(PoolSize)。
ConnectionPool的第二個任務(wù):在連接池的大小(PoolSize)范圍內(nèi),最大限度地使用資源,縮短數(shù)據(jù)庫訪問的使用周期。許多數(shù)據(jù)庫中,連接(Connection)并不是資源的最小單元,控制Statement資源比Connection更重要。以O(shè)racle為例:
每申請一個連接(Connection)會在物理網(wǎng)絡(luò)(如 TCP/IP網(wǎng)絡(luò))上建立一個用于通訊的連接,在此連接上還可以申請一定數(shù)量的Statement。同一連接可提供的活躍Statement數(shù)量可以達到幾百。在節(jié)約網(wǎng)絡(luò)資源的同時,縮短了每次會話周期(物理連接的建立是個費時的操作)。但在一般的應(yīng)用中,多數(shù)按照2.1范例操作,這樣有10個程序調(diào)用,則會產(chǎn)生10次物理連接,每個Statement多帶帶占用一個物理連接,這是極大的資源浪費。 ConnectionPool可以解決這個問題,讓幾十、幾百個Statement只占用同一個物理連接, 發(fā)揮數(shù)據(jù)庫原有的優(yōu)點。
通過ConnectionPool對資源的有效管理,應(yīng)用可以獲得的Statement總數(shù)到達 :

(并發(fā)物理連接數(shù))×(每個連接可提供的Statement數(shù)量)

例如某種數(shù)據(jù)庫可同時建立的物理連接數(shù)為 200個,每個連接可同時提供250個Statement,那么ConnectionPool最終為應(yīng)用提供的并發(fā)Statement總數(shù)為: 200 × 250 = 50,000個。這是個并發(fā)數(shù)字,很少有系統(tǒng)會突破這個量級。所以在本節(jié)的開始,指出資源的耗盡與應(yīng)用程序直接管理有關(guān)。
對資源的優(yōu)化管理,很大程度上依靠數(shù)據(jù)庫自身的JDBC Driver是否具備。有些數(shù)據(jù)庫的JDBC Driver并不支持Connection與Statement之間的邏輯連接功能,如SQLServer,我們只能等待她自身的更新版本了。
對資源的申請、釋放、回收、共享和同步,這些管理是復(fù)雜精密的。所以,ConnectionPool另一個功能就是,封裝這些操作,為應(yīng)用提供簡單的,甚至是不改變應(yīng)用風(fēng)格的調(diào)用接口。

3.簡單JDBC連接池的實現(xiàn)

根據(jù)第二章中原理機制,Snap-ConnectionPool(一種簡單快速的連接池工具,可在www.snapbug.net下載)按照部分的JDBC規(guī)范,實現(xiàn)了連接池所具備的對數(shù)據(jù)庫資源有效管理功能。

3.1 體系描述

在JDBC規(guī)范中,應(yīng)用通過驅(qū)動接口(Driver Interface)直接方法數(shù)據(jù)庫的資源。為了有效、合理地管理資源,在應(yīng)用與JDBC Driver之間,增加了連接池: Snap-ConnectionPool。并且通過面向?qū)ο蟮臋C制,使連接池的大部分操作是透明的。參見下圖,Snap-ConnectionPool的體系:

數(shù)據(jù)庫連接池的實現(xiàn)及原理
圖中所示,通過實現(xiàn)JDBC的部分資源對象接口( Connection, Statement, ResultSet ),在 Snap-ConnectionPool內(nèi)部分別產(chǎn)生三種邏輯資源對象: PooledConnection, PooledStatement和 PooledResultSet。它們也是連接池主要的管理操作對象,并且繼承了JDBC中相應(yīng)的從屬關(guān)系。這樣的體系有以下幾個特點:

透明性。在不改變應(yīng)用原有的使用JDBC驅(qū)動接口的前提下,提供資源管理的服務(wù)。應(yīng)用系統(tǒng),如同原有的 JDBC,使用連接池提供的邏輯對象資源。簡化了應(yīng)用程序的連接池改造。
資源封裝。復(fù)雜的資源管理被封裝在 Snap-ConnectionPool內(nèi)部,不需要應(yīng)用系統(tǒng)過多的干涉。管理操作的可靠性、安全性由連接池保證。應(yīng)用的干涉(如:主動關(guān)閉資源),只起到優(yōu)化系統(tǒng)性能的作用,遺漏操作不會帶來負面影響。
資源合理應(yīng)用。按照JDBC中資源的從屬關(guān)系,Snap-ConnectionPool不僅對Connection進行緩沖處理,對Statement也有相應(yīng)的機制處理。在2.3已描述,合理運用Connection和Statement之間的關(guān)系,可以更大限度地使用資源。所以,Snap- ConnectionPool封裝了Connection資源,通過內(nèi)部管理PooledConnection,為應(yīng)用系統(tǒng)提供更多的Statement 資源。
資源連鎖管理。Snap-ConnectionPool包含的三種邏輯對象,繼承了JDBC中相應(yīng)對象之間的從屬關(guān)系。在內(nèi)部管理中,也依照從屬關(guān)系進行連鎖管理。例如:判斷一個Connection是否超時,需要根據(jù)所包含的Statement是否活躍;判斷Statement也要根據(jù) ResultSet的活躍程度。
3.2 連接池集中管理ConnectionManager

ConnectionPool是Snap-ConnectionPool的連接池對象。在Snap-ConnectionPool內(nèi)部,可以指定多個不同的連接池(ConnectionPool)為應(yīng)用服務(wù)。ConnectionManager管理所有的連接池,每個連接池以不同的名稱區(qū)別。通過配置文件適應(yīng)不同的數(shù)據(jù)庫種類。如下圖所示:

數(shù)據(jù)庫連接池的實現(xiàn)及原理
  通過ConnectionManager,可以同時管理多個不同的連接池,提供通一的管理界面。在應(yīng)用系統(tǒng)中通過 ConnectionManager和相關(guān)的配置文件,可以將凌亂散落在各自應(yīng)用程序中的數(shù)據(jù)庫配置信息(包括:數(shù)據(jù)庫名、用戶、密碼等信息),集中在一個文件中。便于系統(tǒng)的維護工作。

3.3 連接池使用范例

  對2.1的標準JDBC的使用范例,改為使用連接池,結(jié)果如下:

import java.sql.*;
import net.snapbug.util.dbtool.*;
//…
ConnectionPool dbConn = ConnectionManager
.getConnectionPool("testOracle" );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
"select * from demo_table" );
//…
some data source operation
in herers.close();st.close();

  在例子中,Snap-ConnectionPool封裝了應(yīng)用對Connection的管理。只要改變JDBC獲取Connection的方法,為獲取連接池(ConnectionPool)(粗體部分),其他的數(shù)據(jù)操作都可以不做修改。按照這樣的方式,Snap- ConnectionPool可幫助應(yīng)用有效地管理數(shù)據(jù)庫資源。如果應(yīng)用忽視了最后資源的釋放: rs.close() 和 st.close(),連接池會通過超時(time-out)機制,自動回收。

4.小結(jié)

  無論是Snap-ConnectionPool還是其他的數(shù)據(jù)庫連接池,都應(yīng)當(dāng)具備一下基本功能:

  -對源數(shù)據(jù)庫資源的保護

  -充分利用發(fā)揮數(shù)據(jù)庫的有效資源

  -簡化應(yīng)用的數(shù)據(jù)庫接口,封閉資源管理。

  -對應(yīng)用遺留資源的自動回收和整理,提高資源的再次利用率。

  在這個前提下,應(yīng)用程序才能投入更多的精力于各自的業(yè)務(wù)邏輯中。數(shù)據(jù)庫資源也不再成為系統(tǒng)的瓶頸。

三、Druid連接池(新版starter)在SpringBoot下的使用 1.更新pom.xml

   com.alibaba
   druid-spring-boot-starter
   1.1.10
2.編寫application.yml,部分說明寫在注釋了:
spring:
  application:
    name: springboot-test-exam1
  datasource:
    # 使用阿里的Druid連接池
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    # 填寫你數(shù)據(jù)庫的url、登錄名、密碼和數(shù)據(jù)庫名
    url: jdbc:mysql://localhost:3306/databaseName?useSSL=false&characterEncoding=utf8
    username: root
    password: root
    druid:
      # 連接池的配置信息
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      maxActive: 20
      # 配置獲取連接等待超時的時間
      maxWait: 60000
      # 配置間隔多久才進行一次檢測,檢測需要關(guān)閉的空閑連接,單位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一個連接在池中最小生存的時間,單位是毫秒
      minEvictableIdleTimeMillis: 300000
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打開PSCache,并且指定每個連接上PSCache的大小
      poolPreparedStatements: true
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,"wall"用于防火墻
      filters: stat,wall,log4j
      # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
      # 配置DruidStatFilter
      web-stat-filter:
        enabled: true
        url-pattern: "/*"
        exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
      # 配置DruidStatViewServlet
      stat-view-servlet:
        url-pattern: "/druid/*"
        # IP白名單(沒有配置或者為空,則允許所有訪問)
        allow: 127.0.0.1,192.168.163.1
        # IP黑名單 (存在共同時,deny優(yōu)先于allow)
        deny: 192.168.1.73
        #  禁用HTML頁面上的“Reset All”功能
        reset-enable: false
        # 登錄名
        login-username: admin
        # 登錄密碼
        login-password: 123456

為了方便使用application.properties的讀者,使用下面的配置和上面相同

server.port=8080
 
spring.application.name=springboot-test-exam1
 
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/databaseName?useSSL=false&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1
spring.datasource.druid.stat-view-servlet.deny=192.168.1.73
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456

運行結(jié)果
訪問:http://localhost:8080/druid/,登錄名:admin,密碼123456

四、參考引用

https://blog.csdn.net/weixin_...
https://www.cnblogs.com/wym78...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73485.html

相關(guān)文章

  • 數(shù)據(jù)庫連接

    摘要:數(shù)據(jù)庫連接池的基本原理是在內(nèi)部對象池中維護一定數(shù)量的數(shù)據(jù)庫連接,并對外暴露數(shù)據(jù)庫連接獲取和返回方法。統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄漏在較為完備的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預(yù)先的連接占用超時設(shè)定,強制收回被占用連接。 一、數(shù)據(jù)庫連接池的原理 基本原理 對于一個簡單的數(shù)據(jù)庫應(yīng)用,由于對于數(shù)據(jù)庫的訪問不是很頻繁。這時可以簡單地在需要訪問數(shù)據(jù)庫時,就新創(chuàng)建一個連接,用完后就關(guān)閉它,這樣做也...

    Tamic 評論0 收藏0
  • JDBC 4.2 Specifications 中文翻譯 -- 第十一章 連接

    摘要:當(dāng)一個可以被回收的時候,將會使用風(fēng)格的事件去通知連接池管理器應(yīng)用服務(wù)器。為了發(fā)生連接事件時能被通知到,連接池管理器必須實現(xiàn)接口,然后會將其注冊為連接事件的一個監(jiān)聽者。 在基本的 DataSource 實現(xiàn)中,客戶端的 Connection 對象與物理數(shù)據(jù)庫連接有著1:1的關(guān)系。當(dāng) Connection 被關(guān)閉以后,物理連接也會被關(guān)閉。因此,連接的頻繁打開、初始化以及關(guān)閉,會在一個客戶端...

    jayzou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<