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

Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介)

 更新時(shí)間:2022年11月02日 16:12:44   作者:noteless  
DataSource是作為DriverManager的替代品而推出的,DataSource 對(duì)象是獲取連接的首選方法,這篇文章主要介紹了Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介),需要的朋友可以參考下

DataSource是作為DriverManager的替代品而推出的,DataSource 對(duì)象是獲取連接的首選方法。

起源

為何放棄DriverManager

DriverManager負(fù)責(zé)管理驅(qū)動(dòng)程序,并且使用已注冊(cè)的驅(qū)動(dòng)程序進(jìn)行連接。

//1、注冊(cè)驅(qū)動(dòng)
Class.forName("com.mysql.jdbc.Driver");
//數(shù)據(jù)庫(kù)連接所需參數(shù)
String user = "root";
String password = "123456";
String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";
//2、獲取連接對(duì)象
Connection conn = DriverManager.getConnection(url, user, password);

使用DriverManager的一般形式如上面代碼所示

直接使用DriverManager的這種形式,通常需要將驅(qū)動(dòng)程序硬編碼到項(xiàng)目中(JDBC4.0后可以自動(dòng)注冊(cè)驅(qū)動(dòng)程序)

而且最重要的是DriverManager的getConnection方法獲取的連接,是建立與數(shù)據(jù)庫(kù)的連接,是建立與數(shù)據(jù)庫(kù)的連接,是建立與數(shù)據(jù)庫(kù)的連接。

但是建立與數(shù)據(jù)庫(kù)的連接是一項(xiàng)較耗資源的工作,頻繁的進(jìn)行數(shù)據(jù)庫(kù)連接建立操作會(huì)產(chǎn)生較大的系統(tǒng)開(kāi)銷(xiāo)。

隨著企業(yè)級(jí)應(yīng)用復(fù)雜度的提升以及對(duì)性能要求的提高,這一點(diǎn)是難以接受的。

連接池

既然每次使用時(shí)都重新建立與數(shù)據(jù)庫(kù)之間的連接,會(huì)產(chǎn)生較大的系統(tǒng)開(kāi)銷(xiāo)

是否可以事先創(chuàng)建一些連接備用,當(dāng)需要時(shí),從這些連接中選擇一個(gè)提供出去;當(dāng)連接使用完畢后,并不是真正的關(guān)閉,而是將這些數(shù)據(jù)狀態(tài)還原,然后繼續(xù)等待下一個(gè)人使用?

比如滑雪場(chǎng)會(huì)租賃雪具滑雪服等,如果你不是資深玩家,你沒(méi)有必要浪費(fèi)錢(qián)買(mǎi),即使你不差錢(qián),每次去滑雪場(chǎng)都不能輕裝上陣,每次都要攜帶很多裝備,也是一件麻煩事。

這種沒(méi)必要的花費(fèi)或者麻煩其實(shí)都是一種開(kāi)銷(xiāo)。

連接池的核心與租用的理念有類(lèi)似的點(diǎn),重復(fù)使用可以提高連接的利用率,減少開(kāi)銷(xiāo)(當(dāng)然連接池的使用并不需要你花費(fèi)一筆租金)

連接的持有是消耗空間的,但是現(xiàn)在絕大多數(shù)場(chǎng)景下,磁盤(pán)空間并沒(méi)有那么金貴,我們更關(guān)心的是性能,所以空間換取時(shí)間,連接池的邏輯被廣泛應(yīng)用。

數(shù)據(jù)源

DriverManager只是建立與數(shù)據(jù)庫(kù)之間的連接,如何才能將連接池的概念應(yīng)用其中?

一種很自然的方式就是提供一個(gè)薄層的封裝,建立一個(gè)中間層,這個(gè)中間層將DriverManager生成的連接,組織到連接池中,然后從池中提供連接。

Data Source就是DriverManager的一種替代角色,對(duì)外呈現(xiàn)就類(lèi)似于一個(gè)DriverManager,擁有對(duì)外提供連接的能力直接使用DriverManager,驅(qū)動(dòng)程序與管理器是“服務(wù)者---管理者”的形式,借助于管理者才能提供服務(wù)。Data Source將驅(qū)動(dòng)程序的概念淡化了,突出驅(qū)動(dòng)程序能夠提供的服務(wù)與能力,將驅(qū)動(dòng)程序提供的服務(wù)與能力抽象為Data Source數(shù)據(jù)源這一角色。

DataSource中獲取的連接來(lái)自于連接池中,而池中的連接根本也還是從DriverManager獲取而來(lái)

有了數(shù)據(jù)源這一中間層,就可以實(shí)現(xiàn)連接池和分布式事務(wù)的管理。

對(duì)外呈現(xiàn)DataSource就是類(lèi)似于DriverManager的一個(gè)存在。

DataSource的形式是JNDI (Java Naming Directory Interface)

DataSource是JNDI資源的一種,那么到底什么是JNDI呢

此處不過(guò)多解釋?zhuān)梢院?jiǎn)單認(rèn)為JNDI是類(lèi)似這樣一個(gè)東西:

一個(gè)哈希表,類(lèi)型為<String,Object>

JNDI的兩個(gè)最主要操作:bind和lookup。bind操作負(fù)責(zé)往哈希表里存對(duì)象,lookup則根據(jù)這個(gè)鍵值字符串往外取對(duì)象。

開(kāi)發(fā)人員可以使用鍵值——也就是一個(gè)字符串名稱(chēng)——來(lái)獲取某個(gè)對(duì)象。

簡(jiǎn)言之就是可以給一個(gè)對(duì)象命名,然后可以通過(guò)名稱(chēng)找到這個(gè)對(duì)象。

數(shù)據(jù)源的概念在應(yīng)用程序與數(shù)據(jù)庫(kù)連接之間插入了一個(gè)中間層,進(jìn)而可以實(shí)現(xiàn)連接池以及事務(wù)管理,并且以JNDI的形式,也能夠以非常方便的形式使用。

實(shí)現(xiàn)

核心架構(gòu)

關(guān)于數(shù)據(jù)源有以下幾個(gè)核心的接口

CommonDataSource接口定義了 DataSource、XADataSource 和 ConnectionPoolDataSource 之間公用的方法。

DataSource 是 官方定義的獲取 connection 的接口, ConnectionPoolDataSource 是官方定義的從 connection pool 中拿 connection 的接口,XADataSource是定義的用來(lái)獲取分布式事務(wù)連接的接口

也就是分為了三個(gè)方向,基本實(shí)現(xiàn),連接池,事務(wù)

對(duì)于ConnectionPoolDataSource的使用方案應(yīng)該是下面所示

對(duì)于Connection Pool的實(shí)現(xiàn),借助于ConnectionPoolDataSource,進(jìn)而獲取PooledConnection ,然后獲取連接,這是一種標(biāo)準(zhǔn)做法

但是有的時(shí)候 事情的發(fā)展或許并不一定如規(guī)劃的那般發(fā)展

很多的工具類(lèi)僅僅實(shí)現(xiàn)DataSource了,也一并實(shí)現(xiàn)連接池以及事務(wù)的能力,接口就在那里,我直接實(shí)現(xiàn)一個(gè)強(qiáng)大的實(shí)現(xiàn)類(lèi),也沒(méi)什么問(wèn)題

DataSource

這是一個(gè)工廠對(duì)象,用于提供到此 DataSource 對(duì)象所表示的物理數(shù)據(jù)源的連接。

作為 DriverManager 工具的替代項(xiàng),DataSource 對(duì)象是獲取連接的首選方法。

實(shí)現(xiàn) DataSource 接口的對(duì)象通常在基于 JavaTM Naming and Directory Interface (JNDI) API 的命名服務(wù)中注冊(cè)。

DataSource 接口由驅(qū)動(dòng)程序供應(yīng)商實(shí)現(xiàn)。共有三種類(lèi)型的實(shí)現(xiàn):

  • 基本實(shí)現(xiàn) - 生成標(biāo)準(zhǔn)的 Connection 對(duì)象
  • 連接池實(shí)現(xiàn) - 生成自動(dòng)參與連接池的 Connection 對(duì)象。此實(shí)現(xiàn)與中間層連接池管理器一起使用。
  • 分布式事務(wù)實(shí)現(xiàn) - 生成一個(gè) Connection 對(duì)象,該對(duì)象可用于分布式事務(wù),大多數(shù)情況下總是參與連接池。此實(shí)現(xiàn)與中間層事務(wù)管理器一起使用,大多數(shù)情況下總是與連接池管理器一起使用。

DataSource 對(duì)象的屬性在必要時(shí)可以修改。

例如,如果將數(shù)據(jù)源移動(dòng)到另一個(gè)服務(wù)器,則可更改與服務(wù)器相關(guān)的屬性。其優(yōu)點(diǎn)在于,由于可以更改數(shù)據(jù)源的屬性,所以任何訪問(wèn)該數(shù)據(jù)源的代碼都無(wú)需更改。

通過(guò) DataSource 對(duì)象訪問(wèn)的驅(qū)動(dòng)程序本身不會(huì)向 DriverManager 注冊(cè)。

通過(guò)lookup操作獲取 DataSource 對(duì)象,然后使用該對(duì)象創(chuàng)建 Connection 對(duì)象。

使用基本的實(shí)現(xiàn),通過(guò) DataSource 對(duì)象獲取的連接與通過(guò) DriverManager 設(shè)施獲取的連接相同。

數(shù)據(jù)源的實(shí)現(xiàn)必須提供public的無(wú)參的構(gòu)造函數(shù)。

API

DataSource只有兩個(gè)方法(確切的說(shuō)是一個(gè)方法的兩個(gè)重載版本),用于建立與此 DataSource 對(duì)象所表示的數(shù)據(jù)源的連接。

  • Connection getConnection()
  • Connection getConnection(String username, String password)

小結(jié)

DriverManager用于管理驅(qū)動(dòng)程序并且提供數(shù)據(jù)庫(kù)的直連,頻繁的創(chuàng)建和消耗連接增加系統(tǒng)大量開(kāi)銷(xiāo),并且將數(shù)據(jù)庫(kù)連接直接暴露。

數(shù)據(jù)源的概念就是為了在應(yīng)用程序和DriverManager創(chuàng)建的數(shù)據(jù)庫(kù)直接連接之間插入一個(gè)中間層

借助于中間層,應(yīng)用程序與數(shù)據(jù)庫(kù)的連接兩者之間完成了解耦,也能夠?qū)?shù)據(jù)庫(kù)的真實(shí)連接進(jìn)行隱藏;

一旦解耦,通過(guò)中間層間接調(diào)用,類(lèi)似代理模式,就可以添加更多的服務(wù)---連接池以及分布式事務(wù)。

數(shù)據(jù)源相關(guān)接口有三個(gè),但是很多是僅僅實(shí)現(xiàn)了DataSource接口

而對(duì)于連接池本質(zhì)就是一個(gè)容器,負(fù)責(zé)管理創(chuàng)建好的數(shù)據(jù)庫(kù)連接。

連接池與數(shù)據(jù)源邏輯上是兩回事,但是在實(shí)現(xiàn)層面的代碼中DataSource的實(shí)現(xiàn)類(lèi)往往都具有了連接池以及連接池管理方面的功能。

所以有些時(shí)候,DataSource到底是理解成數(shù)據(jù)源?還是javax.sql.DataSource?還是指的一個(gè)實(shí)現(xiàn)?還是一個(gè)實(shí)現(xiàn)了數(shù)據(jù)庫(kù)連接池的實(shí)現(xiàn)?(經(jīng)常一個(gè)實(shí)現(xiàn)了DataSource的并且提供了連接池功能的實(shí)現(xiàn),會(huì)被叫做數(shù)據(jù)庫(kù)連接池)

應(yīng)用

Java作為一種廣泛使用的開(kāi)發(fā)語(yǔ)言,自然不需要我們自己實(shí)現(xiàn)DataSource,一些大廠已經(jīng)幫我們實(shí)現(xiàn)了

比如:DBCP ,C3P0 ,druid

下面的三張圖展示了類(lèi)繼承結(jié)構(gòu),可以看得出來(lái)他們實(shí)現(xiàn)的接口

目前推薦使用ALI的Druid,http://druid.io/

maven中央倉(cāng)庫(kù): http://central.maven.org/maven2/com/alibaba/druid/ 

Druid是一個(gè)開(kāi)源項(xiàng)目,源碼托管在github上,源代碼倉(cāng)庫(kù)地址是 https://github.com/alibaba/druid。

Wiki首頁(yè):

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

與其他主流對(duì)比

https://github.com/alibaba/druid/wiki/%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0%E5%AF%B9%E6%AF%94

數(shù)據(jù)庫(kù)連接池示例

如下一個(gè)簡(jiǎn)單的演示

package jdbc;
import com.alibaba.druid.pool.DruidDataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.commons.dbcp2.BasicDataSource;
public class MyDataSource {
  public static void main(String[] args) throws Exception {
      String user = "root";
      String password = "123456";
      String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";
      //1.獲取連接
      // Connection conn = getDHCPConnection(user,password,url);
      //Connection conn = getC3P0Connection(user,password,url);
      Connection conn = getDruidConnection(user, password, url);
      String sql = "select * from student limit 0,10";
      //2、獲得sql語(yǔ)句執(zhí)行對(duì)象
      Statement stmt = conn.createStatement();
      //3、執(zhí)行并保存結(jié)果集
      ResultSet rs = stmt.executeQuery(sql);
      //4、處理結(jié)果集
      while (rs.next()) {
      System.out.print("id:" + rs.getInt(1));
      System.out.print(",姓名:" + rs.getString(2));
      System.out.print(",年齡:" + rs.getInt(3));
      System.out.println(",性別:" + rs.getString(4));
      }
      conn.close();
      stmt.close();
      rs.close();
}
public static Connection getDruidConnection(String user, String password, String url)
throws Exception {
    DruidDataSource ds = new DruidDataSource();
    ds.setUsername(user);
    ds.setPassword(password);
    ds.setUrl(url);
    ds.setDriverClassName("com.mysql.jdbc.Driver");
    return ds.getConnection();
    }
public static Connection getC3P0Connection(String user, String password, String url)
throws Exception {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    cpds.setUser(user);
    cpds.setPassword(password);
    cpds.setJdbcUrl(url);
    cpds.setDriverClass("com.mysql.jdbc.Driver");
    return cpds.getConnection();
    }
public static Connection getDHCPConnection(String user, String password, String url)
throws Exception {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        Connection connection = dataSource.getConnection();
        return connection;
    }
}

總結(jié)

數(shù)據(jù)源作為DriverManager的替代者,用于獲取數(shù)據(jù)庫(kù)連接,你應(yīng)該總是使用DataSource

DataSource是應(yīng)用程序與數(shù)據(jù)庫(kù)連接的一個(gè)抽象的中間層,是一個(gè)接口

對(duì)于DataSource已經(jīng)有了很多優(yōu)秀的實(shí)現(xiàn),其中較為突出的為Druid,建議使用,Druid不僅僅提供了連接池的功能還提供了其他比如監(jiān)控等功能,非常強(qiáng)大。

對(duì)于數(shù)據(jù)源的應(yīng)用,除了用戶名密碼url還有其他的一些屬性信息,比如最大連接數(shù),建立連接的最大等待時(shí)間等,不同的連接池略微有出入,可以查看手冊(cè)。

對(duì)于DataSource的一些實(shí)現(xiàn),經(jīng)常被叫做數(shù)據(jù)庫(kù)連接池,比如Druid官方文檔中說(shuō)“Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池“,本質(zhì)核心就是DataSource的一個(gè)實(shí)現(xiàn)類(lèi),作為中間層使用,并且基本上都提供了附帶的其他的服務(wù),也就是說(shuō)不僅僅實(shí)現(xiàn)了核心建筑,也基于核心之上構(gòu)建了很多的外圍建設(shè)。

到此這篇關(guān)于Data Source與數(shù)據(jù)庫(kù)連接池簡(jiǎn)介(JDBC簡(jiǎn)介)的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)連接池Data Source內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java8從list集合中取出某一屬性的值的集合案例

    java8從list集合中取出某一屬性的值的集合案例

    這篇文章主要介紹了java8從list集合中取出某一屬性的值的集合案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Python動(dòng)態(tài)類(lèi)型實(shí)現(xiàn)原理及過(guò)程解析

    Python動(dòng)態(tài)類(lèi)型實(shí)現(xiàn)原理及過(guò)程解析

    這篇文章主要介紹了Python動(dòng)態(tài)類(lèi)型實(shí)現(xiàn)原理及過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 重新實(shí)現(xiàn)hashCode()方法

    重新實(shí)現(xiàn)hashCode()方法

    hashCode()是Java中的一個(gè)重要方法,用于計(jì)算對(duì)象的哈希碼。本文介紹了如何重新實(shí)現(xiàn)hashCode()方法,包括使用對(duì)象的屬性計(jì)算哈希碼、使用字符串拼接計(jì)算哈希碼、使用隨機(jī)數(shù)計(jì)算哈希碼等方法。同時(shí),還介紹了如何避免哈希沖突,提高哈希表的效率。
    2023-04-04
  • Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法

    這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法,涉及Java數(shù)學(xué)運(yùn)算計(jì)算隨機(jī)數(shù)及字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Spring Cloud Config對(duì)特殊字符加密處理的方法詳解

    Spring Cloud Config對(duì)特殊字符加密處理的方法詳解

    這篇文章主要給大家介紹了關(guān)于Spring Cloud Config對(duì)特殊字符加密處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解

    Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了Nacos docker單機(jī)模式部署實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot org.springframework.beans.factory.UnsatisfiedDependencyException依賴(lài)注入異常

    SpringBoot org.springframework.beans.factory.Unsatisfie

    本文主要介紹了SpringBoot org.springframework.beans.factory.UnsatisfiedDependencyException依賴(lài)注入異常,文中通過(guò)示例代碼介紹的很詳細(xì),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • SpringBoot整合JdbcTemplate的示例代碼

    SpringBoot整合JdbcTemplate的示例代碼

    JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫(kù)的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了SpringBoot整合JdbcTemplate,需要的朋友可以參考下
    2022-08-08
  • Java中Semaphore信號(hào)量的方法解析

    Java中Semaphore信號(hào)量的方法解析

    這篇文章主要介紹了Java中Semaphore信號(hào)量的方法解析,??Semaphore信號(hào)量是用來(lái)控制同?時(shí)訪問(wèn)?特定?資?源的?線?程數(shù)量,它通?過(guò)協(xié)調(diào)?各個(gè)?線?程,以保證合理的使用公共?資源,需要的朋友可以參考下
    2023-12-12
  • Java通用Mapper UUID簡(jiǎn)單示例

    Java通用Mapper UUID簡(jiǎn)單示例

    今天小編就為大家分享一篇關(guān)于Java通用Mapper UUID簡(jiǎn)單示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論