国产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)為非??岬慕忉尅N襾?lái)這裡是為了完成它。

在具體的上下文中,正在討論 Hikari 連接池。但是,如果 Hikari 是一個(gè)連接池,那麼「池」會(huì)是什麼?

首先,泳池概念

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

我們可以用經(jīng)濟(jì)學(xué)來(lái)類(lèi)比嗎?這是一個(gè)與現(xiàn)實(shí)世界充滿(mǎn)缺陷和不準(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é)束的…

交出鋤頭的另一個(gè)選擇是製作鋤頭。您是這些土地的領(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è)元素
  • 返回元素

物件中的其他常見(jiàn)內(nèi)容:

  • 能夠透過(guò)在池中註冊(cè)來(lái)按需建立更多對(duì)象
  • 能夠從中銷(xiāo)毀物件(或?qū)⑵渑c解除關(guān)聯(lián))

連線到 JDBC 資料庫(kù)

那麼,讓我們離HikariCP更近一些吧。這裡我們來(lái)談?wù)凧ava中的資料庫(kù)連線。

在java中,我們要求建立與資料庫(kù)的連線。有直接連接選項(xiàng),您需要直接了解要呼叫哪些類(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)與資料庫(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)行字串替換並產(chǎ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 的元資料資料夾。對(duì)於 JDBC 驅(qū)動(dòng)程序,META-INF/services/java.sql.Driver,我用實(shí)作 java.sql.Driver 的類(lèi)別記錄了它:br.com.softsite.pstmtnullsafe.jdbc.PstmtNullSafeDriver。

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

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

靜態(tài)區(qū)塊自行載入。我們?nèi)绾沃滥膫€(gè)連接應(yīng)該由我的驅(qū)動(dòng)程式管理?該呼叫是透過(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)求記憶體中連接:

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

為了「封裝」連接,我的約定表明我不重複 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í)作了 AutoCloseable 介面。這表示您獲取連接,根據(jù)需要使用該連接,然後關(guān)閉該連接。對(duì)此使用一些間接連接是非常標(biāo)準(zhǔn)的,或者,如果您直接使用連接,請(qǐng)?jiān)?try-with-resources:
區(qū)塊中使用它

jdbc:sqlite::memory:

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

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

jdbc:pstmt-nullsafe:sqlite::memory:

getJdbcConnection() 的一種可能實(shí)作是依賴(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í)作了所有 Connection 方法,但它自己不執(zhí)行任何操作,它僅委託給作為建構(gòu)函式傳遞給它的連接。例如,對(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ì)被填滿(mǎn)!那我們要解決這個(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中它提到它會(huì)釋放與此連線相關(guān)的所有 JDBC 資源。這意味著我需要保留所有語(yǔ)句、結(jié)果集、PreparedStatements 等的記錄。我們可以透過(guò)在 ConnectionDelegator 上建立一個(gè)名為 closeAllInnerResources() 的受保護(hù)方法來(lái)處理此問(wèn)題。並在 close() 中呼叫它:

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

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

你知道Java為提供連線的物件取什麼名字嗎?資料來(lái)源。您知道 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)橘Y料來(lái)源的過(guò)程
合併。

什麼是光CP?

HikariCP 是一個(gè)資料來(lái)源。具體來(lái)說(shuō),就是一個(gè)池化資料來(lái)源。但他有一個(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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)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脫衣器

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ù)共享初始化代碼、複雜字段初始化或匿名類(lèi)初始化場(chǎng)景,與靜態(tài)初始化塊不同的是它每次實(shí)例化時(shí)都會(huì)執(zhí)行,而靜態(tài)初始化塊僅在類(lèi)加載時(shí)運(yùn)行一次。

什麼是工廠模式? 什麼是工廠模式? 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)單工廠、工廠方法和抽象工廠,分別適用於不同複雜度的需求。

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

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

什麼是類(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)換的情況包括處理用戶(hù)輸入、數(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