欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談常用Java數(shù)據(jù)庫連接池(小結(jié))

 更新時(shí)間:2019年07月09日 10:34:21   作者:2Simple  
這篇文章主要介紹了淺談常用Java數(shù)據(jù)庫連接池(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

在這里所謂的數(shù)據(jù)庫連接是指通過網(wǎng)絡(luò)協(xié)議與數(shù)據(jù)庫服務(wù)之間建立的TCP連接。通常,與數(shù)據(jù)庫服務(wù)進(jìn)行通信的網(wǎng)絡(luò)協(xié)議無需由應(yīng)用程序本身實(shí)現(xiàn),原因有三:

1.實(shí)現(xiàn)復(fù)雜度大,需要充分理解和掌握相應(yīng)的通信協(xié)議。
2.代碼難以復(fù)用,每個(gè)應(yīng)用程序都需要獨(dú)立實(shí)現(xiàn)一套對(duì)應(yīng)的網(wǎng)絡(luò)協(xié)議(不同公司之間,同一公司的不同技術(shù)棧之間難以復(fù)用實(shí)現(xiàn)相同協(xié)議的代碼)
3.性能難以保證,不同的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)可能存在巨大的性能差距

正因?yàn)槿绱耍袁F(xiàn)實(shí)的實(shí)現(xiàn)方式是:

首先,定義網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn),這樣只要支持這個(gè)標(biāo)準(zhǔn)協(xié)議的數(shù)據(jù)庫就可以使用相應(yīng)的客戶端與之通信。

其次,將實(shí)現(xiàn)這個(gè)標(biāo)準(zhǔn)協(xié)議的客戶端獨(dú)立為一個(gè)通信庫,這樣只需要在應(yīng)用程序中使用這個(gè)通信組件庫就可以方便地實(shí)現(xiàn)與數(shù)據(jù)庫進(jìn)行交互。

通常,我們將實(shí)現(xiàn)了網(wǎng)絡(luò)協(xié)議的通信庫稱之為數(shù)據(jù)庫驅(qū)動(dòng)程序。當(dāng)然,對(duì)于不同的編程語言,需要對(duì)應(yīng)編寫相應(yīng)的數(shù)據(jù)庫驅(qū)動(dòng)

實(shí)現(xiàn)。以與關(guān)系型數(shù)據(jù)庫通信為例,在Java中實(shí)現(xiàn)的驅(qū)動(dòng)程序?yàn)镴DBC,Python中的驅(qū)動(dòng)程序?yàn)镸ySQLdb。
由于通過TCP與數(shù)據(jù)庫建立網(wǎng)絡(luò)連接的代價(jià)非常高昂,而且耗時(shí)(TCP建立連接需要“三次握手”,斷開連接需要“四次握手”)。所以在實(shí)踐中通常不直接單獨(dú)使用連接進(jìn)行數(shù)據(jù)庫操作,而是使用連接池的方式,這主要是處于以下兩方面的考慮:

應(yīng)用程序本身需要更低的響應(yīng)時(shí)間,如果每次數(shù)據(jù)庫操作都需要經(jīng)過“建立連接->通信(增刪改查)->斷開連接”這個(gè)過程,那么勢(shì)必會(huì)導(dǎo)致響應(yīng)延時(shí)的增加。

避免服務(wù)器資源被耗盡,隨著業(yè)務(wù)量的增大,對(duì)應(yīng)的數(shù)據(jù)庫操作必然會(huì)隨之增加,如果對(duì)客戶端的連接數(shù)不加以控制,可能會(huì)導(dǎo)致數(shù)據(jù)庫服務(wù)器的CPU和內(nèi)存資源被大量的網(wǎng)絡(luò)連接快速耗盡,這樣將導(dǎo)致服務(wù)不可用。

在Java中使用得比較流行的數(shù)據(jù)庫連接池主要有:DBCP,c3p0,druid。

另外,不論使用什么連接池,低層都是使用JDBC連接,即:在應(yīng)用程序中都需要加載JDBC驅(qū)動(dòng)程序。

DBCP

https://commons.apache.org/proper/commons-dbcp/index.html

DBCP是Apache下獨(dú)立的數(shù)據(jù)庫連接池組件,在Tomcat中使用的連接池組件就是DBCP,支持JDBC3,JDBC4。關(guān)于更多JDBC版本信息,詳見:https://en.wikipedia.org/wiki/Java_Database_Connectivity。

c3p0

http://www.mchange.com/projects/c3p0/
使用c3p0有多種方式,如:既可以直接使用API方式配置c3p0,也可以通過文件的方式進(jìn)行配置,配置文件有2種形式:properties或xml文件。

<dependencies>
  <!-- JDBC驅(qū)動(dòng) -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.42</version>
  </dependency>
  
  <!-- c3p0連接池 -->
  <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
  </dependency>

  <!-- 日志組件 -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
  </dependency>
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
  </dependency>
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  </dependency>
</dependencies>

1.使用Java API方式配置c3p0

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver      
cpds.setJdbcUrl("jdbc:mysql://host:port/db");
cpds.setUser("username");                 
cpds.setPassword("password");                 
  
cpds.setMinPoolSize(5);                   
cpds.setMaxPoolSize(20);
cpds.setAcquireIncrement(5);

// 直接從連接池中獲取連接
Connection conn = cpds.getConnection();
query(conn);

// 關(guān)閉連接池
// cpds.close();

2.使用文件方式配置c3p0

2.1 使用c3p0.properties文件進(jìn)行配置

需要在classpath路徑下添加配置文件:c3p0.properties,內(nèi)容如下:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://host:port/db
c3p0.user=root
c3p0.password=
c3p0.minPoolSize=5
c3p0.maxPoolSize=20
c3p0.acquireIncrement=5

在應(yīng)用程序中只需要直接創(chuàng)建ComboPooledDataSource對(duì)象即可(c3p0會(huì)自動(dòng)從classpath加載c3p0.properties中的配置信息):

ComboPooledDataSource cpds = new ComboPooledDataSource();
Connection conn = cpds.getConnection();
query(conn);
cpds.close();

注意: 使用c3p0.properties作為配置文件時(shí),每個(gè)參數(shù)的name前綴必須是“c3p0”,如:“c3p0.driverClass=com.mysql.jdbc.Driver”。

2.2 使用c3p0-config.xml文件進(jìn)行配置

使用這種方式會(huì)比使用c3p0.properties更加高級(jí),支持配置多個(gè)數(shù)據(jù)源,同樣需要在classpath路徑下添加文件:c3p0-config.xml。

<c3p0-config>
  <!-- 默認(rèn)數(shù)據(jù)源 -->
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://host:port/db</property>
    <property name="user">username</property>
    <property name="password">password</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>
    <property name="acquireIncrement">5</property>
  </default-config>

  <!-- 定義帶名稱的數(shù)據(jù)源 -->
  <named-config name="myDataSource">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/test_jdbc</property>
    <property name="user">root</property>
    <property name="password"></property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>
    <property name="acquireIncrement">5</property>
  </named-config>
</c3p0-config>
// 使用默認(rèn)數(shù)據(jù)源
// ComboPooledDataSource cpds = new ComboPooledDataSource();

// 使用指定名稱的數(shù)據(jù)源
ComboPooledDataSource cpds = new ComboPooledDataSource("myDataSource");
Connection conn = cpds.getConnection();
query(conn);
cpds.close();

3.c3p0常用配置

<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://host:port/db</property>
    <property name="user">username</property>
    <property name="password">password</property>

    <!-- 連接池初始化時(shí)創(chuàng)建的連接數(shù),默認(rèn)值: 3 -->
    <property name="initialPoolSize">3</property>
    <!-- 連接池保持的最小連接數(shù),默認(rèn)值: 3 -->
    <property name="minPoolSize">3</property>
    <!-- 連接池中擁有的最大連接數(shù),如果獲得新連接時(shí)會(huì)使連接總數(shù)超過這個(gè)值則不會(huì)再獲取新連接,而是等待其他連接釋放。 -->
    <property name="maxPoolSize">15</property>
    <!-- 連接池在無空閑連接可用時(shí)一次性創(chuàng)建的新數(shù)據(jù)庫連接數(shù),默認(rèn)值: 3 -->
    <property name="acquireIncrement">3</property>
    <!-- 連接的最大空閑時(shí)間,如果超過這個(gè)時(shí)間,某個(gè)數(shù)據(jù)庫連接還沒有被使用,則會(huì)斷開掉這個(gè)連接。為0,則永遠(yuǎn)不會(huì)斷開連接。默認(rèn)值: 0,單位: 秒 -->
    <property name="maxIdleTime">0</property>
    <!-- 連接測(cè)試語句 -->
    <property name="preferredTestQuery">select 1</property>
    <!-- 用來配置測(cè)試空閑連接的間隔時(shí)間??梢杂脕斫鉀QMySQL 8小時(shí)斷開連接的問題。因?yàn)樗WC連接池會(huì)每隔一定時(shí)間對(duì)空閑連接進(jìn)行一次測(cè)試,從而保證有效的空閑連接能每隔一定時(shí)間訪問一次數(shù)據(jù)庫,將MySQL8小時(shí)無會(huì)話的狀態(tài)打破。為0則不測(cè)試。默認(rèn)值:0,單位: 秒 -->
    <property name="idleConnectionTestPeriod">30</property>
    <!-- 連接池在獲得新連接失敗時(shí)重試的次數(shù),如果小于等于0則無限重試直至連接獲得成功。默認(rèn)值: 30 -->
    <property name="acquireRetryAttempts">30</property>
    <!-- 連接池在獲得新連接時(shí)的間隔時(shí)間,默認(rèn)值: 1000,單位: 毫秒 -->
    <property name="acquireRetryDelay">1000</property>
  </default-config>
</c3p0-config>

druid

https://github.com/alibaba/druid
阿里開源的druid不單純是一個(gè)連接池,還添加了監(jiān)控功能,目前已經(jīng)是非常受推崇的連接池組件,詳細(xì)配置參數(shù)請(qǐng)參考官網(wǎng)。

當(dāng)然,還存在一些其他的數(shù)據(jù)庫連接池實(shí)現(xiàn),例如:Tomcat自己就實(shí)現(xiàn)了一個(gè)連接池組件,根據(jù)官方的說法,這個(gè)連接池正是為了在Tomcat中替換DBCP,詳見:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 阿里dubbo出錯(cuò)提示Thread pool is EXHAUSTED問題及解決方法

    阿里dubbo出錯(cuò)提示Thread pool is EXHAUSTED問題及解決方法

    這篇文章主要介紹了阿里dubbo出錯(cuò)提示Thread pool is EXHAUSTED的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java中的BlockingQueue接口源碼解析

    Java中的BlockingQueue接口源碼解析

    這篇文章主要介紹了Java中的BlockingQueue接口源碼解析,BlockingQueue接口表示阻塞隊(duì)列,是Java并發(fā)包中阻塞隊(duì)列的接口定義規(guī)范,阻塞隊(duì)列意味著對(duì)于該隊(duì)列的操作是線程安全的,當(dāng)多個(gè)線程存放元素進(jìn)入隊(duì)列或者從隊(duì)列中取出元素都是線程安全的,需要的朋友可以參考下
    2023-11-11
  • java開發(fā)中如何使用JVisualVM進(jìn)行性能分析

    java開發(fā)中如何使用JVisualVM進(jìn)行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此強(qiáng)大的后盾怎能不強(qiáng)大?在Jdk6.0以后的版本中是自帶的,配置好環(huán)境變量然后在運(yùn)行中輸入“JVisualVm”或直接到Jdk的安裝目錄的Bin目錄下找到運(yùn)行程序即可運(yùn)行。如果是用Jdk1.5或以前版本的朋友就得要單獨(dú)安裝了
    2015-12-12
  • JPA配置方式+逆向工程映射到Entity實(shí)體類

    JPA配置方式+逆向工程映射到Entity實(shí)體類

    這篇文章主要介紹了JPA配置方式+逆向工程映射到Entity實(shí)體類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解

    Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot利用@Async異步調(diào)用:使用Future及定義超時(shí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Spring Boot集成starrocks快速入門Demo(適用場(chǎng)景)

    Spring Boot集成starrocks快速入門Demo(適用場(chǎng)景)

    StarRocks 是新一代極速全場(chǎng)景 MPP (Massively Parallel Processing) 數(shù)據(jù)庫,StarRocks 的愿景是能夠讓用戶的數(shù)據(jù)分析變得更加簡(jiǎn)單和敏捷,這篇文章主要介紹了Spring Boot集成starrocks快速入門Demo,需要的朋友可以參考下
    2024-08-08
  • Java連接ftp服務(wù)器實(shí)例代碼

    Java連接ftp服務(wù)器實(shí)例代碼

    這篇文章主要介紹了Java連接ftp服務(wù)器實(shí)例代碼 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案

    Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案

    今天小編就為大家分享一篇關(guān)于Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法

    myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法

    本篇文章介紹了,myeclipse智能提示設(shè)置的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05
  • Java女裝商城系統(tǒng)的實(shí)現(xiàn)流程

    Java女裝商城系統(tǒng)的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)女裝商城系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11

最新評(píng)論