主頁 > 資料庫 > 「資料庫、資料庫連接池、資料源」這些概念你真的理解了嗎?

「資料庫、資料庫連接池、資料源」這些概念你真的理解了嗎?

2023-04-22 08:04:01 資料庫

前言

我學習的程序中,對于連接池和資料源分得不是很清楚,而且我發現有的人將資料庫等同于資料源,或者將資料源等同于連接池,實際上這些說法并不準確,

在某次作業中,同事 A 說道,這個資料源不行,那么換一個資料源就可以了,結果我看他操作,原來是改寫了配置中的資料庫連接的 URL,當時我在想,這就是換資料源了?我以為說是把 Druid 這個資料源換掉,至于為什么會這么想,主要是因為有個 DruidDataSource

現在,搞清楚它們的區別不妨聽我說說,歡迎大家在評論區說出你的看法!

資料庫

一提到資料庫,大家都會想到 MySQL、Oracle、PostgreSQL 這些,我們也習慣這樣講:我這個專案的資料庫使用的是 MySQL,是吧,

實際上,嚴格來講,這些是資料庫管理系統(Database Management System,DBMS),它們是一種可以操作和管理資料庫(Database)的軟體,真正的資料庫是指存盤資料的倉庫,這些資料都是持久化存盤在計算機的硬碟上的,

比如 MySQL,我們在 MySQL 客戶端使用 CREATE DATABASE db_demo; 命令,這樣就創建了一個名為 db_demo 的資料庫,

我們可以使用 SHOW VARIABLES LIKE '%datadir'; 命令查看資料庫存放在哪個地方,

資料庫連接池

那什么是資料庫連接池呢?在說什么是連接池之前,我們先說說什么是連接(Connection、Connect),

連接

在一開始學習 MySQL 的時候,我們通過 MySQL 的客戶端來連接上 MySQL 的服務端:

mysql -u root -p 123456

當出現如下輸出時,就說明我們成功連接上 MySQL 的服務端,接著就能輸入各種 SQL 陳述句了:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 81
Server version: 5.7.39 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

以上的連接,只是連接到 MySQL 服務端,并沒有指定連接到哪一個資料庫,當然我們可以通過 USE 資料庫名稱 來切換到指定的資料庫,后續的操作都是在該資料庫上進行,

此處的連接,是一個動作,即 Connect,

我們在學習 JDBC 的時候,知道了想要通過 Java 去操作資料庫,那么就需要借助 JDBC 來操作,

在這個程序中,我們首先需要加載資料庫的驅動,然后建立 Java 程式與某個資料庫的連接:

String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/db_demo";
String username = "root";
String password = "123456";
// 加載驅動
Class.forName(driver);
// 獲取該資料庫連接(即幫我們創建了一個可以操作db_demo的連接物件)
Connection conn = DriverManager.getConnection(url, username, password);

獲取完之后,我們就能通過連接獲取相關的 Statement 物件(比如預編譯的 PreparedStatement 物件),將我們的 SQL 陳述句丟給 Statement 物件,通過 Statement 物件執行操作,

操作完畢后就關閉了資料庫連接,

conn.close();

這里的連接,是一個動作,也是一個物件,因為 Java 是面向物件的,抽象出了一個連接物件,這個連接物件包含了驅動資訊、連接的 URL、DBMS 的用戶名和密碼,主要表明了此次連接到的是哪個資料庫,

池化技術

現在,我們每進行一次相關的資料庫操作,就需要經過打開/建立連接,執行相關操作,銷毀/關閉連接這么一個程序,

對于一個簡單的、對資料庫的操作不是很頻繁的應用來說,問題不大,不會有很明顯的性能開銷,

但是,對于一個經常操作資料庫的應用來說,當有許多操作的請求過來時,多次的創建與銷毀連接物件,是相當耗費資源的,比如網路帶寬,記憶體,CPU 的運算等等,當然除了耗費資源,創建與銷毀也會耗費時間,所以就有了資料庫連接池的出現,這種是屬于「池化技術」

池化技術有這樣的特點,就是提前準備,然后進行復用,對于資料庫連接池,就是提前準備好一定量的連接物件放在一個「池子」中,你可以想象水池,有一定量的水,當有需要的時候,就從這個池子中獲取連接物件,然后進行資料庫的操作,操作完了后,就把物件放回池子中,這就是所謂的「資料庫連接池」

這里也就有種用空間換時間的感覺,通過準備一定量的連接物件,避免由呼叫者手動去打開和關閉連接,進而提高效率,

自己實作一個資料庫連接池

選擇你喜歡的一個地方新建一個類和一個組態檔,我將這兩個東西放在了同一個目錄下:

db.properties:

# 資料庫相關配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_one_demo
username=root
password=123456
# 初始化的資料庫連接池大小
initialPoolSize=5

ConnectionPool.java:

/**
 * @author god23bin
 * @description 簡單的資料庫連接池
 */
public class ConnectionPool {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    /**
     * 使用一個List來存放連接,將這個List作為連接池
     **/
    private static List<Connection> connectionPool;

    /**
     * 標記對應的連接是否被使用,是為 true,否為 false
     **/
    private static List<Boolean> usedConnections;

    /**
     * 連接池大小,即池子中連接的個數
     **/
    private static int initialPoolSize;

    // 讀取組態檔只需要一次就夠了,所以用static代碼塊
    static {
        //讀取檔案配置
        InputStream inputStream = null;
        Properties properties = new Properties();
        try {
            // 如果你的是 Spring Boot 應用,db.properties 放在 resource 目錄下,則可以通過 ClassPathResource 來獲取這個組態檔
            // inputStream = new ClassPathResource("db.properties").getInputStream();
            inputStream = ConnectionPool.class.getClassLoader().getResourceAsStream("db.properties");


            properties.load(inputStream);
            driver = properties.getProperty("driver");
            url = properties.getProperty("url");
            username = properties.getProperty("username");
            password = properties.getProperty("password");
            initialPoolSize = Integer.parseInt(properties.getProperty("initialPoolSize"));

            connectionPool = new ArrayList<>(initialPoolSize);
            usedConnections = new ArrayList<>(initialPoolSize);
            // 加載驅動
            Class.forName(driver);
            // 創建連接并將連接放到List集合中,標記為未被使用
            for (int i = 0; i < initialPoolSize; i++) {
                Connection connection = DriverManager.getConnection(url, username, password);
                connectionPool.add(connection);
                usedConnections.add(false);
            }

        } catch (IOException | SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取連接
     * @return java.sql.Connection 回傳連接物件
     **/
    public synchronized Connection getConnection() throws SQLException {
        // 判斷是否有空閑的連接可用,有的話就標記為使用中,接著回傳這個連接
        for (int i = 0; i < initialPoolSize; i++) {
            if (!usedConnections.get(i)) {
                usedConnections.set(i, true);
                return connectionPool.get(i);
            }
        }

        // 如果沒有可用的連接,那么創建一個新的連接,把它加入到池中,并回傳,簡單處理,這里的創建并沒有上限
        Connection connection = DriverManager.getConnection(url, username, password);
        connectionPool.add(connection);
        usedConnections.add(true);
        initialPoolSize++;
        return connection;
    }

    /**
     * 釋放連接,將其標記為未使用
     * @param connection 連接
     **/
    public synchronized void releaseConnection(Connection connection) {
        int index = connectionPool.indexOf(connection);
        usedConnections.set(index, false);
    }
}

目前我知道的開源的資料庫連接池有 DBCP、C3P0,還有阿里的 Druid,

資料源

資料源(Data Source),即資料的來源,在咱們開發的應用中,資料可以來源于網路,也可以來源于本地的檔案,還可以來源于資料庫,

簡而言之,資料源指定了資料從哪里來,換句話說,資料源是指存盤資料的位置,

在 Java 中,有一個 javax.sql.DataSource 介面,這個介面定義了一組獲取資料庫連接的方法,

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

以上,就是所謂的資料源,

資料源和連接池的關系

有的人會把資料源等同于連接池,那到底是不是呢?從概念上看,明顯不是一個東西,資料源是資料來源,連接池則是連接的快取池,用于存盤和管理資料庫連接,

我認為,出現這種看法是因為我們在配置資料源的時候,把連接池也進行了相關的配置,所以才會把資料源等同于連接池,

不過,雖然不是同個東西,但是資料源和連接池是緊密相關的,它們一起協同作業來管理資料庫連接并提供訪問資料庫的功能,

在日常開發中,資料源除了指資料來自哪里,還可以有其他資訊!對于資料源物件來說,它定義了資料庫連接引數以及連接資料庫所需的所有資訊,例如資料庫服務器的地址、用戶名和密碼等,

有的連接池,會從資料源物件中獲取連接引數并使用它們來創建和管理資料庫連接,就比如當我們在專案中使用開源的資料庫連接池的時候,就需要進行相關的配置,對于開源的資料庫連接池,它們都具有實作 Java 的標準資料源介面 javax.sql.DataSource 的類,可以直接使用,

以 Druid 為例,這個類是 com.alibaba.druid.pool.DruidDataSource,可以用于創建和管理資料庫連接,

在我看來,Druid 是一個既包含資料源功能又包含連接池功能的開源專案,它可以用作資料源,通過配置和管理連接池來提供訪問資料庫的功能,Druid 提供了一組高效的連接池和監控工具,可用于管理和監控資料庫連接,

https://github.com/alibaba/druid/wiki/DruidDataSource配置

這里給出 Druid 的一些配置:

 <bean id="dataSource"  init-method="init" destroy-method="close"> 
     <!-- 基本屬性 url、user、password -->
     <property name="url" value="https://www.cnblogs.com/god23bin/p/${jdbc_url}" />
     <property name="username" value="https://www.cnblogs.com/god23bin/p/${jdbc_user}" />
     <property name="password" value="https://www.cnblogs.com/god23bin/p/${jdbc_password}" />

     <!-- 配置初始化大小、最小、最大 -->
     <property name="initialSize" value="https://www.cnblogs.com/god23bin/p/5" />
     <property name="minIdle" value="https://www.cnblogs.com/god23bin/p/10" />
     <property name="maxActive" value="https://www.cnblogs.com/god23bin/p/20" />
     
     <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
     <property name="timeBetweenEvictionRunsMillis" value="https://www.cnblogs.com/god23bin/p/2000" />
     
     <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
     <property name="minEvictableIdleTimeMillis" value="https://www.cnblogs.com/god23bin/p/600000" />
     <property name="maxEvictableIdleTimeMillis" value="https://www.cnblogs.com/god23bin/p/900000" />

 </bean>

從上面的配置中可以看到,我們在這里進行了資料源配置,這里不僅僅配置了連接物件連接的是哪一個資料庫,它的用戶名和用戶密碼是多少,還配置了資料庫連接池的初始化大小、最小和最大連接數等屬性,

總結

一開始,我主要說明了資料庫和資料庫管理系統(DBMS)的區別,雖然我們通常會將 MySQL、Oracle、PostgreSQL 等軟體稱為資料庫,但它們實際上是一種可以操作和管理資料庫的軟體,而真正的資料庫是指存盤資料的倉庫,

接著,講了什么是資料庫連接池,資料庫連接池是一種池化技術,它可以提前準備好一定數量的連接物件并將它們放在一個「池子」中,這些連接物件可以被重復使用,當需要進行資料庫操作時,可以從連接池中獲取連接物件并執行相關操作,執行完畢后,連接物件會被放回到池子中,以供后續的操作使用,這種技術可以避免頻繁地創建和銷毀連接物件,從而提高應用程式的性能和效率,

最后,講了什么是資料源以及它與連接池的關系,它們兩者是不同的,或者說有這么三個詞:「資料源」、「資料庫連接池」、「資料源物件」,單獨說資料源,那么就顧名思義,資料的來源,資料庫連接池,用于管理連接的,方便連接的復用,提升效率,資料源物件,它包含了連接池的配置,也配置了資料源,即資料從哪里來,

以上,也不知道我又沒有說清楚,歡迎大家評論!

最后的最后

希望各位螢屏前的靚仔靚女們給個三連!你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!

咱們下期再見!

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/550821.html

標籤:MySQL

上一篇:mysql索引--普通索引,唯一索引,主鍵索引,參照完整性約束,資料完整性約束

下一篇:返回列表

標籤雲
其他(157827) Python(38089) JavaScript(25381) Java(17985) C(15215) 區塊鏈(8256) C#(7972) AI(7469) 爪哇(7425) MySQL(7137) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4555) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1959) Web開發(1951) HtmlCss(1919) python-3.x(1918) 弹簧靴(1913) C++(1910) xml(1889) PostgreSQL(1872) .NETCore(1854) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 「資料庫、資料庫連接池、資料源」這些概念你真的理解了嗎?

    我學習的程序中,對于連接池和資料源分得不是很清楚,而且我發現有的人將資料庫等同于資料源,或者將資料源等同于連接池,實際上這些說法并不準確。 ......

    uj5u.com 2023-04-22 08:04:01 more
  • mysql索引--普通索引,唯一索引,主鍵索引,參照完整性約束,資料完整性

    -- 方法1:create index-- 對employee表的員工部門號列創建普通索引depart_ind -- create index depart_ind on employees(員工部門號); -- 對employee表的姓名和地址列創建復合索引ad_ind;-- create ind ......

    uj5u.com 2023-04-22 08:03:57 more
  • Redis - 資料型別映射底層結構

    Redis 作為一個成熟的記憶體型資料庫,對于記憶體占用和操作性能上會有自己的取舍,通過這些知識可以理解為什么 Redis 的性能有時候會變化得那么快。 ......

    uj5u.com 2023-04-21 09:33:41 more
  • MYSQL---主從同步概述與配置

    一、MYSQL主從同步概述 1、什么是MySQL主從同步? 實作資料自動同步的服務結構 主服務器(master): 接受客戶端訪問連接 從服務器(slave):自動同步主服務器資料 2、主從同步原理 Maste:啟用binlog 日志 Slave:Slave_IO: 復制master主機binlog ......

    uj5u.com 2023-04-21 09:33:28 more
  • Redis - 資料型別映射底層結構

    Redis 作為一個成熟的記憶體型資料庫,對于記憶體占用和操作性能上會有自己的取舍,通過這些知識可以理解為什么 Redis 的性能有時候會變化得那么快。 ......

    uj5u.com 2023-04-21 09:32:26 more
  • MYSQL---主從同步概述與配置

    一、MYSQL主從同步概述 1、什么是MySQL主從同步? 實作資料自動同步的服務結構 主服務器(master): 接受客戶端訪問連接 從服務器(slave):自動同步主服務器資料 2、主從同步原理 Maste:啟用binlog 日志 Slave:Slave_IO: 復制master主機binlog ......

    uj5u.com 2023-04-21 09:26:58 more
  • 讀SQL進階教程筆記13_SQL中的分組和層級

    1. 資料分組 1.1. SQL的陳述句中具有分組功能的是GROUP BY和PARTITION BY 1.1.1. 兩者都有數學的理論基礎 1.1.2. 都可以根據指定的列為表分組 1.1.3. 區別僅僅在于,GROUP BY在分組之后會把每個分組聚合成一行資料 1.1.4. GROUP BY的作用是 ......

    uj5u.com 2023-04-21 08:51:51 more
  • day03-商家查詢快取02

    功能02-商鋪查詢快取02 知識補充 (1)快取穿透 https://blog.csdn.net/qq_45637260/article/details/125866738 快取穿透(cache penetration)是指用戶訪問的資料既不在快取當中,也不在資料庫中。出于容錯的考慮,如果從底層資料 ......

    uj5u.com 2023-04-21 08:51:18 more
  • MySQL 中常見的幾種高可用架構部署方案

    MySQL 中的集群部署方案 前言 MySQL Replication InnoDB Cluster InnoDB ClusterSet InnoDB ReplicaSet MMM MHA Galera Cluster MySQL Cluster MySQL Fabric 參考 MySQL 中的集群 ......

    uj5u.com 2023-04-21 08:50:32 more
  • 創建本地yum倉庫

    本文分享自天翼云開發者社區《創建本地yum倉庫》,作者: zzzzgj; 背景 有的部署環境不通外網,但希望繼續使用yum命令下載依賴包而不修改部署腳本邏輯。因此記錄一個本地repo的建立方法。 1、獲取依賴包 # 如在通網的機器上下載openssl-devel所有依賴yumdownloader - ......

    uj5u.com 2023-04-21 08:49:55 more