国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java java教程 什么是光池?

什么是光池?

Jan 07, 2025 pm 04:08 PM

O que é o hikari pool?

什么是光池?

BlueSky 上的一篇帖子中的這個(gè)簡(jiǎn)單問(wèn)題讓我得到了一個(gè)我認(rèn)為非??岬慕忉?。我來(lái)這里是為了完成它。

在具體的上下文中,正在談?wù)?Hikari 連接池。但是,如果 Hikari 是一個(gè)連接池,那么“池”會(huì)是什么?

首先,泳池概念

在解釋什么是 HikariCP 之前,我們需要先解釋一下連接池是什么。為了解釋連接池,我們需要解釋

我們可以用經(jīng)濟(jì)學(xué)來(lái)類(lèi)比嗎?這是一個(gè)與現(xiàn)實(shí)世界充滿缺陷和不準(zhǔn)確的歷史經(jīng)濟(jì)類(lèi)比,但是來(lái)吧,為了解釋而迅速停止你的懷疑!它是獨(dú)立的。

想象一下您是中世紀(jì)時(shí)代的領(lǐng)主/女士。你拿著工具來(lái)進(jìn)行農(nóng)民的工作。并且您希望它們能夠工作。那么如何保證這一點(diǎn)呢?如果工具是你的?你需要給農(nóng)民提供工具,很簡(jiǎn)單。

所以想象一下這種情況:你的農(nóng)民需要一把鋤頭來(lái)除草,所以他去那里向你要一把鋤頭。你會(huì)給他鋤頭并繼續(xù)生活。但如果他不歸還,他的鋤頭怎么辦?總有一天會(huì)結(jié)束的……

交出鋤頭的另一種選擇是制作鋤頭。您是這些土地的領(lǐng)主/女士,因此您可以聯(lián)系鐵匠,將金屬熔煉成鋤頭的形狀并將其安裝到手柄中。但這不是你可以在沒(méi)有農(nóng)民坐在候診室的情況下立即生產(chǎn)的東西。為了實(shí)現(xiàn)這個(gè)新功能,您需要大量的時(shí)間和精力。

現(xiàn)在,如果農(nóng)民在一天結(jié)束時(shí)歸還鋤頭,第二天它就可以供其他農(nóng)民使用。

在這里,您正在控制鋤頭池是一種設(shè)計(jì)模式,指示您可以執(zhí)行以下操作:

  • 向他要一個(gè)元素
  • 返回元素

對(duì)象中的其他常見(jiàn)內(nèi)容:

  • 通過(guò)在池中注冊(cè)來(lái)按需創(chuàng)建更多對(duì)象的能力
  • 能夠從中銷(xiāo)毀對(duì)象(或?qū)⑵渑c解除關(guān)聯(lián))

連接到 JDBC 數(shù)據(jù)庫(kù)

那么,讓我們離HikariCP更近一些吧。這里我們來(lái)談?wù)凧ava中的數(shù)據(jù)庫(kù)連接。

在java中,我們要求建立與數(shù)據(jù)庫(kù)的連接。有直接連接選項(xiàng),您需要直接了解要調(diào)用哪些類(lèi)以及一些細(xì)節(jié),或者只是享受服務(wù)發(fā)現(xiàn)選項(xiàng)。

先驗(yàn)地,為了使用服務(wù)發(fā)現(xiàn),服務(wù)提供者會(huì)提供一種方法來(lái)注冊(cè)他所提供的內(nèi)容,然后“服務(wù)發(fā)現(xiàn)”會(huì)跟蹤它以查看誰(shuí)可以服務(wù)該請(qǐng)求。

服務(wù)發(fā)現(xiàn)案例:pstmt-null-safe

我曾經(jīng)遇到過(guò)需要建立 JDBC 連接來(lái)與數(shù)據(jù)庫(kù)通信的情況。但是,我的 JDBC 驅(qū)動(dòng)程序不接受使用 null 作為值,只接受直接在查詢(xún)中使用 null。那么我做了什么?司機(jī)頂司機(jī)!

總體思路如下。想象一下,我有一個(gè)查詢(xún),我想將值插入到:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

現(xiàn)在想象一下我正在處理這個(gè)值第一次插入到銀行中。為此,我需要將其保留為 ID=1、CONTENT=first 和 PARENT=null,因?yàn)楫吘箾](méi)有這樣的父記錄(畢竟它是第一個(gè))。

自然會(huì)做什么:

try (final var pstmt = conn.prepareStatement(
                """
                INSERT INTO some_table (id, content, parent)
                VALUES (?, ?, ?)
                """)) {

    pstmt.setInt(1, 1);
    pstmt.setString(2, "first");
    pstmt.setNull(3, Types.INTGEGER); // java.sql.Types
    pstmt.executeUpdate(); // de fato altere o valor
}

我想繼續(xù)這樣使用它,畢竟這是慣用的使用方式。根據(jù)丘比特的說(shuō)法,“I”來(lái)自“慣用語(yǔ)”。擁有慣用代碼的想法正是為了“減少不必要的心理負(fù)擔(dān)”。

為了解決這個(gè)問(wèn)題,我的選擇是:將prepareStatement留到executeUpdate之前的最后一刻。因此,我存儲(chǔ)了要應(yīng)用的所有空值,當(dāng)我意識(shí)到我實(shí)際上需要一個(gè)空值時(shí),我運(yùn)行字符串替換并生成一個(gè)新查詢(xún),并且這個(gè)新查詢(xún)將實(shí)際執(zhí)行。

在這種情況下,我從:
開(kāi)始

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

所以,我必須輸入這些值:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

-- 1, 'first', NULL

但我實(shí)際上無(wú)法使用 null,所以我創(chuàng)建了一個(gè)鍵來(lái)標(biāo)識(shí)第三位是 null:

-- (value, value, NULL)
INSERT INTO some_table (id, content, parent)
VALUES (?, ?, NULL)
-- 1, 'first'

在這種情況下,我準(zhǔn)備這個(gè)新字符串并根據(jù)要求放置參數(shù)。

好吧,也就是說(shuō),我如何向我的應(yīng)用程序表明我需要使用 JDBC 驅(qū)動(dòng)程序?我如何注冊(cè)?

相關(guān)項(xiàng)目是 Pstmt Null Safe。基本上,Java 類(lèi)加載器有一個(gè)神奇之處,即加載 jar 時(shí),它會(huì)查找名為 META-INF 的元數(shù)據(jù)文件夾。對(duì)于 JDBC 驅(qū)動(dòng)程序,META-INF/services/java.sql.Driver,我用實(shí)現(xiàn) java.sql.Driver 的類(lèi)記錄了它:br.com.softsite.pstmtnullsafe.jdbc.PstmtNullSafeDriver。

根據(jù) java.sql.Driver 文檔,每個(gè)驅(qū)動(dòng)程序都應(yīng)該創(chuàng)建自己的實(shí)例并向 DriverManager 注冊(cè)。我是這樣實(shí)現(xiàn)的:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

靜態(tài)塊自行加載。我們?nèi)绾沃滥膫€(gè)連接應(yīng)該由我的驅(qū)動(dòng)程序管理?該調(diào)用是通過(guò) DriverManager#getConnection(String url) 進(jìn)行的。我們有 URL 來(lái)詢(xún)問(wèn)驅(qū)動(dòng)程序是否接受連接。約定(這里又是慣用的使用方式)是將其作為 URL 方案的前綴。因?yàn)槲蚁M业尿?qū)動(dòng)程序連接到另一個(gè)驅(qū)動(dòng)程序之上,所以我使用了以下方案:

try (final var pstmt = conn.prepareStatement(
                """
                INSERT INTO some_table (id, content, parent)
                VALUES (?, ?, ?)
                """)) {

    pstmt.setInt(1, 1);
    pstmt.setString(2, "first");
    pstmt.setNull(3, Types.INTGEGER); // java.sql.Types
    pstmt.executeUpdate(); // de fato altere o valor
}

因此,為了執(zhí)行測(cè)試,我連接了 SQLite,并使用 Xerial 指示器通過(guò)連接 URI 請(qǐng)求內(nèi)存中連接:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

為了“封裝”連接,我的約定表明我不重復(fù) jdbc:,所以:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

-- 1, 'first', NULL

剖析上面的 URI:

-- (value, value, NULL)
INSERT INTO some_table (id, content, parent)
VALUES (?, ?, NULL)
-- 1, 'first'

好的,你如何表明這一點(diǎn)?如果我可以打開(kāi)連接,Driver#acceptsURL 必須返回 true。我可以這樣做:

public static final PstmtNullSafeDriver instance;

static {
    instance = new PstmtNullSafeDriver();
    try {
        DriverManager.registerDriver(instance);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

但是如果我嘗試加載不存在的驅(qū)動(dòng)程序,這表明什么?沒(méi)什么,下次會(huì)出問(wèn)題的。這并不好,理想的情況是從一開(kāi)始就崩潰。因此,為此,我將嘗試從下面加載驅(qū)動(dòng)程序,如果不能,我將返回 false:

jdbc:pstmt-nullsafe:<url de conex?o sem jdbc:>
\__/ \____________/
 |    |
 |    Nome do meu driver
 Padr?o para indicar JDBC

實(shí)際的驅(qū)動(dòng)程序代碼還有一些與此處討論的 HikariCP、DataSource、JDBC 或本文討論的主題無(wú)關(guān)的要點(diǎn)。

因此,當(dāng)請(qǐng)求與 DriverManager 的“空安全”連接時(shí),它首先找到我的驅(qū)動(dòng)程序,然后我的驅(qū)動(dòng)程序遞歸地嘗試檢查是否有可能在后臺(tái)建立連接。確認(rèn)有一個(gè)驅(qū)動(dòng)程序能夠處理這個(gè)問(wèn)題,我說(shuō)是的,這是可能的。

Java中JDBC連接的使用模式

Connection 接口實(shí)現(xiàn)了 AutoCloseable 接口。這意味著您獲取連接,根據(jù)需要使用該連接,然后關(guān)閉該連接。對(duì)此使用一些間接連接是非常標(biāo)準(zhǔn)的,或者,如果您直接使用連接,請(qǐng)?jiān)?try-with-resources:
塊中使用它

jdbc:sqlite::memory:

現(xiàn)在,創(chuàng)建連接的過(guò)程是一個(gè)昂貴的過(guò)程。而且服務(wù)發(fā)現(xiàn)過(guò)程并不是完全免費(fèi)的。因此,理想的情況是保存驅(qū)動(dòng)程序,然后生成連接。讓我們一點(diǎn)一點(diǎn)地開(kāi)發(fā)它。

首先,我們需要有一個(gè)可以通過(guò)驅(qū)動(dòng)程序啟動(dòng)的對(duì)象。它可以很容易地是一個(gè)全局對(duì)象、一個(gè)注入的 Spring 組件或類(lèi)似的東西。我們稱(chēng)之為 JdbcConnector:

jdbc:pstmt-nullsafe:sqlite::memory:

getJdbcConnection() 的一種可能實(shí)現(xiàn)是依賴(lài)于該函數(shù)包含的狀態(tài):

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

到目前為止一切都很順利。但是……還記得最初的例子嗎?農(nóng)民在工具池中索要一把鋤頭?那么……我們要考慮到這一點(diǎn)嗎?我們可以將連接返回到,而不是實(shí)際關(guān)閉連接。為了正確性,我會(huì)防止多個(gè)同時(shí)訪問(wèn),但我不會(huì)擔(dān)心這里的效率。

我們假設(shè)我有一個(gè)名為 ConnectionDelegator 的類(lèi)。它實(shí)現(xiàn)了所有 Connection 方法,但它自己不執(zhí)行任何操作,它僅委托給作為構(gòu)造函數(shù)傳遞給它的連接。例如,對(duì)于 isClosed():
方法

try (final var pstmt = conn.prepareStatement(
                """
                INSERT INTO some_table (id, content, parent)
                VALUES (?, ?, ?)
                """)) {

    pstmt.setInt(1, 1);
    pstmt.setString(2, "first");
    pstmt.setNull(3, Types.INTGEGER); // java.sql.Types
    pstmt.executeUpdate(); // de fato altere o valor
}

其他方法依此類(lèi)推。它是抽象的,因?yàn)橐粋€(gè)簡(jiǎn)單的事實(shí)是,當(dāng)我使用它時(shí),我想強(qiáng)迫自己做一些除了簡(jiǎn)單委托之外的事情。

好吧,我們走吧。這個(gè)想法是,將請(qǐng)求連接,該連接可能存在也可能不存在。如果存在,我將其包裝在這個(gè)新類(lèi)中,以便在關(guān)閉連接時(shí)將其返回到 pool。嗯,所以我要在 close() 方法中做一些事情...好吧,我們先包裝一下。讓我們將 getConnection() 保留為同步以避免并發(fā)問(wèn)題:

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

好的,如果我的連接中有元素,我會(huì)使用它們直到它為空。但它永遠(yuǎn)不會(huì)被填滿!那么我們要解決這個(gè)問(wèn)題嗎?當(dāng)它關(guān)閉時(shí),我們可以將其返回

INSERT INTO some_table (id, content, parent)
VALUES (?, ?, ?)

-- 1, 'first', NULL

好的,現(xiàn)在當(dāng)您使用完連接后,它會(huì)被發(fā)送回
泳池。這不滿足 Connection#close() 方法的文檔,因?yàn)樵谖臋n中它提到它釋放與此連接相關(guān)的所有 JDBC 資源。這意味著我需要保留所有語(yǔ)句、結(jié)果集、PreparedStatements 等的記錄。我們可以通過(guò)在 ConnectionDelegator 上創(chuàng)建一個(gè)名為 closeAllInnerResources() 的受保護(hù)方法來(lái)處理此問(wèn)題。并在 close() 中調(diào)用它:

-- (value, value, NULL)
INSERT INTO some_table (id, content, parent)
VALUES (?, ?, NULL)
-- 1, 'first'

這樣我們就可以根據(jù)需要向我返回連接,并且能夠形成資源池

你知道Java給提供連接的對(duì)象起什么名字嗎?數(shù)據(jù)源。您知道 Java 對(duì) DataSource 還說(shuō)了什么嗎?從概念上講,有一些類(lèi)型。在這些類(lèi)型中,最相關(guān)的 2 種是:

  • 基本:它不進(jìn)行池化,它請(qǐng)求連接,它只是創(chuàng)建并返回它
  • 池化:其中存在與銀行的連接池

這里我們經(jīng)歷了始終創(chuàng)建連接(基本類(lèi)型)以及演變?yōu)閿?shù)據(jù)源的過(guò)程
合并

什么是光CP?

HikariCP 是一個(gè)數(shù)據(jù)源。具體來(lái)說(shuō),是一個(gè)池化數(shù)據(jù)源。但他有一個(gè)特點(diǎn):他是所有人中速度最快的。為了保證這個(gè)速度,在應(yīng)用程序生命周期中使用的連接中,HikariCP 制定了一個(gè)秘密:它已經(jīng)創(chuàng)建了所有可用的連接。因此,當(dāng) getConnection 到達(dá)時(shí),HikariCP 只需要檢查連接池

如果你想更深入地研究這個(gè)主題,你可以查看 Baeldung 上有關(guān)該主題的這篇文章,也可以查看 github 上的存儲(chǔ)庫(kù)。

以上是什么是光池?的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

熱門(mén)話題

hashmap和hashtable之間的區(qū)別? hashmap和hashtable之間的區(qū)別? Jun 24, 2025 pm 09:41 PM

HashMap與Hashtable的區(qū)別主要體現(xiàn)在線程安全、null值支持及性能方面。1.線程安全方面,Hashtable是線程安全的,其方法大多為同步方法,而HashMap不做同步處理,非線程安全;2.null值支持上,HashMap允許一個(gè)null鍵和多個(gè)null值,Hashtable則不允許null鍵或值,否則拋出NullPointerException;3.性能方面,HashMap因無(wú)同步機(jī)制效率更高,Hashtable因每次操作加鎖性能較低,推薦使用ConcurrentHashMap替

為什么我們需要包裝紙課? 為什么我們需要包裝紙課? Jun 28, 2025 am 01:01 AM

Java使用包裝類(lèi)是因?yàn)榛緮?shù)據(jù)類(lèi)型無(wú)法直接參與面向?qū)ο蟛僮?,而?shí)際需求中常需對(duì)象形式;1.集合類(lèi)只能存儲(chǔ)對(duì)象,如List利用自動(dòng)裝箱存儲(chǔ)數(shù)值;2.泛型不支持基本類(lèi)型,必須使用包裝類(lèi)作為類(lèi)型參數(shù);3.包裝類(lèi)可表示null值,用于區(qū)分未設(shè)置或缺失的數(shù)據(jù);4.包裝類(lèi)提供字符串轉(zhuǎn)換等實(shí)用方法,便于數(shù)據(jù)解析與處理,因此在需要這些特性的場(chǎng)景下,包裝類(lèi)不可或缺。

什么是接口中的靜態(tài)方法? 什么是接口中的靜態(tài)方法? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

JIT編譯器如何優(yōu)化代碼? JIT編譯器如何優(yōu)化代碼? Jun 24, 2025 pm 10:45 PM

JIT編譯器通過(guò)方法內(nèi)聯(lián)、熱點(diǎn)檢測(cè)與編譯、類(lèi)型推測(cè)與去虛擬化、冗余操作消除四種方式優(yōu)化代碼。1.方法內(nèi)聯(lián)減少調(diào)用開(kāi)銷(xiāo),將頻繁調(diào)用的小方法直接插入調(diào)用處;2.熱點(diǎn)檢測(cè)識(shí)別高頻執(zhí)行代碼并集中優(yōu)化,節(jié)省資源;3.類(lèi)型推測(cè)收集運(yùn)行時(shí)類(lèi)型信息實(shí)現(xiàn)去虛擬化調(diào)用,提升效率;4.冗余操作消除根據(jù)運(yùn)行數(shù)據(jù)刪除無(wú)用計(jì)算和檢查,增強(qiáng)性能。

什么是實(shí)例初始器塊? 什么是實(shí)例初始器塊? Jun 25, 2025 pm 12:21 PM

實(shí)例初始化塊在Java中用于在創(chuàng)建對(duì)象時(shí)運(yùn)行初始化邏輯,其執(zhí)行先于構(gòu)造函數(shù)。它適用于多個(gè)構(gòu)造函數(shù)共享初始化代碼、復(fù)雜字段初始化或匿名類(lèi)初始化場(chǎng)景,與靜態(tài)初始化塊不同的是它每次實(shí)例化時(shí)都會(huì)執(zhí)行,而靜態(tài)初始化塊僅在類(lèi)加載時(shí)運(yùn)行一次。

變量的最終關(guān)鍵字是什么? 變量的最終關(guān)鍵字是什么? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

什么是工廠模式? 什么是工廠模式? Jun 24, 2025 pm 11:29 PM

工廠模式用于封裝對(duì)象創(chuàng)建邏輯,使代碼更靈活、易維護(hù)、松耦合。其核心答案是:通過(guò)集中管理對(duì)象創(chuàng)建邏輯,隱藏實(shí)現(xiàn)細(xì)節(jié),支持多種相關(guān)對(duì)象的創(chuàng)建。具體描述如下:工廠模式將對(duì)象創(chuàng)建交給專(zhuān)門(mén)的工廠類(lèi)或方法處理,避免直接使用newClass();適用于多類(lèi)型相關(guān)對(duì)象創(chuàng)建、創(chuàng)建邏輯可能變化、需隱藏實(shí)現(xiàn)細(xì)節(jié)的場(chǎng)景;例如支付處理器中通過(guò)工廠統(tǒng)一創(chuàng)建Stripe、PayPal等實(shí)例;其實(shí)現(xiàn)包括工廠類(lèi)根據(jù)輸入?yún)?shù)決定返回的對(duì)象,所有對(duì)象實(shí)現(xiàn)共同接口;常見(jiàn)變體有簡(jiǎn)單工廠、工廠方法和抽象工廠,分別適用于不同復(fù)雜度的需求。

什么是類(lèi)型鑄造? 什么是類(lèi)型鑄造? Jun 24, 2025 pm 11:09 PM

類(lèi)型轉(zhuǎn)換有兩種:隱式和顯式。1.隱式轉(zhuǎn)換自動(dòng)發(fā)生,如將int轉(zhuǎn)為double;2.顯式轉(zhuǎn)換需手動(dòng)操作,如使用(int)myDouble。需要類(lèi)型轉(zhuǎn)換的情況包括處理用戶輸入、數(shù)學(xué)運(yùn)算或函數(shù)間傳遞不同類(lèi)型的值時(shí)。需要注意的問(wèn)題有:浮點(diǎn)數(shù)轉(zhuǎn)整數(shù)會(huì)截?cái)嘈?shù)部分、大類(lèi)型轉(zhuǎn)小類(lèi)型可能導(dǎo)致數(shù)據(jù)丟失、某些語(yǔ)言不允許直接轉(zhuǎn)換特定類(lèi)型。正確理解語(yǔ)言的轉(zhuǎn)換規(guī)則有助于避免錯(cuò)誤。

See all articles