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

ホームページ Java &#&チュートリアル 光プールとは何ですか?

光プールとは何ですか?

Jan 07, 2025 pm 04:08 PM

O que é o hikari pool?

光プールとは何ですか?

BlueSky の投稿にあるこの単純な質(zhì)問(wèn)から、非常に素晴らしいと思う説明が得られました。それを終わらせるためにここに來(lái)ました。

具體的な文脈では、光接続プールが話題になっていました。しかし、Hikari が接続プールである場(chǎng)合、「プール」とは何でしょうか?

まず最初に、プールのコンセプト

HikariCP とは何かを説明する前に、接続プール とは何かを説明する必要があります。 接続プールを説明するには、プールを説明する必要があります。

これを経済に例えてみましょうか?歴史的な経済アナロジーは現(xiàn)実世界との欠陥や不正確さに満ちていますが、説明を聞いただけでその不信感をすぐに止めてください。自己完結(jié)型です。

あなたが中世の領(lǐng)主/貴婦人であると想像してください。あなたは農(nóng)民の仕事を遂行するための道具を持っています。そして、あなたは彼らに働いてもらいたいのです。では、どうやってこれを保証するのでしょうか?ツールがあなたのものなら?簡(jiǎn)単なことですが、道具を農(nóng)民に屆ける必要があります。

それでは、狀況を想像してみてください。あなたのお百姓さんが土地の草取りに鍬が必要なので、そこへ行ってあなたに鍬を求めます。あなたは彼に鍬を與えて生き続けるでしょう。しかし、彼がそれを返さなかったら、彼の在庫(kù)のクワはどうなるでしょうか?いつかは終わりが來(lái)る…

鍬を引き渡す代わりに、鍬を作ってもらうこともできます。あなたはそれらの土地の領(lǐng)主/淑女なので、鍛冶屋にアクセスして金屬を製錬して鍬の形にし、ハンドルにはめ込むことができます。しかし、これは農(nóng)民が待合室に座っていなければ、すぐに生産できるものではありません。この新しい機(jī)能を作成するには、膨大な時(shí)間とエネルギーが必要です。

これで、農(nóng)民が一日の終わりに鍬を返卻すると、翌日には別の農(nóng)民がその鍬を使用できるようになります。

ここでは、クワのプールを制御しています。 プール は、次のアクションを?qū)g行できることを示すデザイン パターンです:

  • 彼に要素を?qū)い亭蓼?/li>
  • 要素をそれに戻します

オブジェクトのプールに含めるその他の一般的なもの:

  • プールに登録することで、オンデマンドでさらに多くのオブジェクトを作成する機(jī)能
  • プールからオブジェクトを破棄する(またはそのプールからの関連付けを解除する)

JDBCデータベースへの接続

さて、HikariCPに近づいてみましょう。ここでは Java でのデータベース接続について話しましょう。

Java では、データベースへの接続を確立するように求められます。直接接続オプションがあります。これを呼び出すクラスと詳細(xì)について直接理解する必要があります。そうでない場(chǎng)合は、単純にサービス検出オプションを利用してください。

サービス ディスカバリーを使用するには、アプリオリに、サービス プロバイダーが提供しているものを登録する方法を作成し、その後、「サービス ディスカバリー」がそれを追跡して、誰(shuí)がそのリクエストに対応できるかを確認(rèn)します。

サービス検出の例: pstmt-null-safe

データベースと通信するために JDBC 接続を確立する必要がある場(chǎng)合がありました。ただし、私の JDBC ドライバーは値として null を使用できず、クエリ內(nèi)で直接 null を使用することのみを受け入れました。それで、私は何をしましたか?ドライバーの上にドライバーが!

一般的なアイデアは次のとおりです。値を挿入したい次のクエリがあると想像してください:

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

ここで、この値を銀行に初めて挿入する処理をしていると想像してください。これを行うには、ID=1、CONTENT=first、PARENT=null のままにしておく必要があります。結(jié)局のところ、そのような親レコードは存在しないからです (結(jié)局のところ、これが最初です)。

自然に行われること:

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
}

このまま使い続けたいです、やっぱり慣用的な使い方ですね。 CUPID によれば、I は「慣用的な」から來(lái)ています。慣用的なコードを持つという考え方は、まさに「不必要な精神的負(fù)荷を軽減する」ためです。

これを解決するために、私の選択は、executeUpdate の直前まで prepareStatement をそのままにしておくことでした。そこで、適用するすべての null を保存し、実際に null が必要であることに気付いたときに、文字列置換を?qū)g行して新しいクエリを生成すると、この新しいクエリが実際に実行されます。

この場(chǎng)合、次のことから始めます:

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

したがって、次の値を入力する必要があります:

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

-- 1, 'first', NULL

しかし、実際には null を使用することはできないので、3 番目の場(chǎng)所が null であることを識(shí)別するキーを作成します。

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

この場(chǎng)合、この新しい文字列を準(zhǔn)備し、要求された?jī)?nèi)容に従って引數(shù)を配置します。

そうは言っても、JDBC ドライバーを使用する必要があることをアプリケーションに示すにはどうすればよいでしょうか?どうやって登録しましたか?

問(wèn)題のプロジェクトは Pstmt Null Safe です?;镜膜?、Java クラスローダーには、jar をロードするときに META-INF というメタデータ フォルダーを検索するという魔法があります。 JDBC ドライバーの場(chǎng)合は、META-INF/services/java.sql.Driver であり、java.sql.Driver を?qū)g裝するクラスでそれをメモしました: br.com.softsite.pstmtnullsafe.jdbc.PstmtNullSafeDriver.

java.sql.Driver のドキュメントによると、すべてのドライバーはそれ自體のインスタンスを作成し、DriverManager に登録する必要があります。私は次のように実裝しました:

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

靜的ブロックはそれ自體をロードします。そして、どの接続をドライバーが管理すべきかをどうやって知ることができるのでしょうか?呼び出しは DriverManager#getConnection(String url) を通じて行われます。ドライバーに接続を受け入れるかどうかを問(wèn)い合わせるための URL があります。慣例 (ここでも慣用的な使用方法) は、URL スキームの先頭にそれを付けることです。自分のドライバーを別のドライバーの上に接続したいので、次のスキームを使用して接続しました。

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
}

そこで、テストを?qū)g行するために SQLite に接続し、Xerial インジケーターを使用して接続 URI を通じてメモリ內(nèi)接続をリクエストしました。

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

接続を「エンベロープ」するには、私の規(guī)則では 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'

それで、これをどのように示しますか?接続を開(kāi)くことができる場(chǎng)合、Driver#acceptsURL は true を返す必要があります。これだけでできます:

public static final PstmtNullSafeDriver instance;

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

しかし、存在しないドライバーをロードしようとした場(chǎng)合、これは何を示すのでしょうか?何もありません。別の機(jī)會(huì)に問(wèn)題が発生する可能性があります。それは良くない、理想は最初からクラッシュすることだ。このため、以下からドライバーをロードしようとします。ロードできない場(chǎng)合は false を返します:

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

実際のドライバー コードには、HikariCP、DataSource、JDBC、またはこの投稿で取り上げるトピックについてのここでの議論には関係のない點(diǎn)がさらにいくつかあります。

そのため、DriverManager への「ヌル セーフ」接続をリクエストすると、まずドライバーが検索され、ドライバーは內(nèi)部で接続の可能性があるかどうかを再帰的に確認(rèn)しようとします。これに対処できるドライバーがあることを確認(rèn)したので、可能です。

Java での JDBC 接続の使用パターン

Connection インターフェイスは AutoCloseable インターフェイスを?qū)g裝します。これは、接続を取得し、必要に応じてその接続を使用し、その後接続を閉じることを意味します。これで間接的に使用するか、接続を直接使用する場(chǎng)合は try-with-resources:
ブロック內(nèi)で使用するのが非常に標(biāo)準(zhǔn)的です。

jdbc:sqlite::memory:

ところで、つながりを築くプロセスは高価なプロセスです。また、サービス検出 プロセスも完全に無(wú)料というわけではありません。したがって、ドライバー を保存してから接続を生成するのが理想的です。これを少しずつ開(kāi)発していきましょう。

まず、ドライバーで起動(dòng)できるオブジェクトを用意する必要があります。グローバル オブジェクト、挿入された Spring コンポーネント、またはその類のものを簡(jiǎn)単に使用できます。これを JdbcConnector と呼びましょう:

jdbc:pstmt-nullsafe:sqlite::memory:

getJdbcConnection() の実裝可能な 1 つは、この関數(shù)に含まれる狀態(tài)に依存することです。

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

今のところすべてが順調(diào)です。しかし...農(nóng)民が道具プールで鍬を求めた最初の例を覚えていますか?ということで…これを考慮してみましょうか?実際に接続を閉じる代わりに、接続をプールに戻すことができます。正確を期すために、複數(shù)の同時(shí)アクセスから保護(hù)しますが、ここでは効率については心配しません。

ここでは、ConnectionDelegator というクラスがあると仮定しましょう。これはすべての Connection メソッドを?qū)g裝しますが、それ自體では何も行わず、コンストラクターとして渡された接続に委任するだけです。たとえば、isClosed():
メソッドの場(chǎ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
}

他の方法についても同様です。これを使用するときに、単純な委任以外の何かを自分に強(qiáng)制したいという単純な事実に対して抽象的です。

それでは、行きましょう??激ǚ饯趣筏皮稀⒔泳Aが要求されるが、存在する場(chǎng)合もあれば、存在しない場(chǎng)合もあります。存在する場(chǎng)合は、この新しいクラスでラップして、接続を閉じるときに pool に返せるようにします。うーん、それでは close() メソッドで何かをするつもりです... さて、最初にラップしましょう。同時(shí)実行の問(wèn)題を避けるために、getConnection() を同期したままにしておきます。

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

わかりました。接続の プール に要素がある場(chǎng)合は、それが空になるまで使用します。しかし、それは決して満たされません!それで、この問(wèn)題は解決するのでしょうか?閉まったらプールに返卻しましょう!

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

-- 1, 'first', NULL

OK、接続の使用が終了すると、
に送信されます。 プール。これは、Connection#close() メソッドのドキュメントの內(nèi)容を満たしていません。ドキュメントには、この接続に関連するすべての JDBC リソースが解放されると記載されているからです。これは、すべての Statement、ResultSet、PreparedStatement などの記録を保持する必要があることを意味します。これは、ConnectionDelegator に closeAllInnerResources() という保護(hù)されたメソッドを作成することで処理できます。そしてそれを close() で呼び出します:

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

これにより、オンデマンドで私に接続を返し、リソースのプールを形成する機(jī)能を備えたものができました。

Java が接続を提供するオブジェクトにどのような名前を付けるか知っていますか?データソース。 Java が DataSource について他に何を言っているか知っていますか?概念的に言えば、いくつかのタイプがあるということ。これらのタイプのうち、最も関連性の高い 2 つは次のとおりです:

  • 基本: プーリングは行わず、接続を要求し、接続を作成して返すだけです
  • pooled: 銀行への接続がプールされています

そしてここでは、常に接続 (基本タイプ) を作成し、データソースに進(jìn)化するプロセスを?qū)g行します
プール.

ヒカリCPとは何ですか?

HikariCP はデータソースです。具體的には、プールされた DataSource。しかし、彼には 1 つの特徴があります。それは、彼が誰(shuí)よりも速いということです。この速度を保証するために、アプリケーションのライフサイクル中に使用する接続のプールで、HikariCP は秘密を作ります。つまり、使用可能なすべての接続がすでに作成されています。したがって、getConnection が到著すると、HikariCP は接続のプールをチェックするだけで済みます。

このテーマをさらに詳しく知りたい場(chǎng)合は、このテーマに関する Baeldung のこの記事をチェックしてください。また、github のリポジトリもチェックしてください。

以上が光プールとは何ですか?の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ハッシュマップとハッシュテーブルの違いは? ハッシュマップとハッシュテーブルの違いは? Jun 24, 2025 pm 09:41 PM

ハッシュマップとハッシュテーブルの違いは、主にスレッドの安全性、ヌル価値のサポート、パフォーマンスに反映されます。 1.スレッドの安全性の観點(diǎn)から、ハッシュテーブルはスレッドセーフであり、その方法はほとんど同期メソッドであり、ハッシュマップはスレッドセーフではない同期処理を?qū)g行しません。 2。ヌル値のサポートに関しては、ハッシュマップは1つのnullキーと複數(shù)のヌル値を許可しますが、ハッシュテーブルはnullキーや値を許可しません。 3.パフォーマンスの観點(diǎn)から、ハッシュマップは同期メカニズムがないため、より効率的です。ハッシュテーブルは、各操作のロックパフォーマンスが低いです。代わりにconcurrenthashmapを使用することをお?jiǎng)幛幛筏蓼埂?/p>

なぜラッパークラスが必要なのですか? なぜラッパークラスが必要なのですか? Jun 28, 2025 am 01:01 AM

Javaは、基本的なデータ型がオブジェクト指向の操作に直接參加できないため、ラッパークラスを使用し、実際のニーズでオブジェクトフォームが必要になることが多いためです。 1.コレクションクラスは、リストが自動(dòng)ボクシングを使用して數(shù)値を保存するなど、オブジェクトのみを保存できます。 2。ジェネリックは基本的なタイプをサポートしておらず、パッケージングクラスはタイプパラメーターとして使用する必要があります。 3.パッケージングクラスは、null値を表して、データまたは欠落データを區(qū)別できます。 4.パッケージングクラスは、データの解析と処理を容易にするための文字列変換などの実用的な方法を提供するため、これらの特性が必要なシナリオでは、パッケージングクラスは不可欠です。

インターフェイスの靜的メソッドとは何ですか? インターフェイスの靜的メソッドとは何ですか? Jun 24, 2025 pm 10:57 PM

StaticMethodsinInterfaceswereIntroducatedinjava8toalowutilityは、interfaceitself.beforejava8、そのような導(dǎo)入のために導(dǎo)入されたコード、rediveTodisorgedCode.now、statecmethodssprovidreebenefits:1)彼らの可能性のある測(cè)定di

JITコンパイラはどのようにコードを最適化しますか? JITコンパイラはどのようにコードを最適化しますか? Jun 24, 2025 pm 10:45 PM

JITコンパイラは、メソッドインライン、ホットスポット検出とコンピレーション、タイプの投機(jī)と偏見(jiàn)、冗長(zhǎng)操作の排除の4つの方法を通じてコードを最適化します。 1。メソッドインラインで呼び出しのオーバーヘッドを減らし、頻繁に小さな方法と呼ばれる挿入をコールに直接直接挿入します。 2。ホットスポットの検出と高周波コードの実行とそれを中央に最適化して、リソースを節(jié)約します。 3。タイプ投機(jī)は、敬v的な呼び出しを達(dá)成するためにランタイムタイプ情報(bào)を収集し、効率を向上させます。 4.冗長(zhǎng)操作は、運(yùn)用データの削除に基づいて役に立たない計(jì)算と検査を排除し、パフォーマンスを向上させます。

インスタンスイニシャルイザーブロックとは何ですか? インスタンスイニシャルイザーブロックとは何ですか? Jun 25, 2025 pm 12:21 PM

インスタンス初期化ブロックは、Javaで使用され、コンストラクターの前に実行されるオブジェクトを作成するときに初期化ロジックを?qū)g行します。複數(shù)のコンストラクターが初期化コード、複雑なフィールド初期化、または匿名のクラス初期化シナリオを共有するシナリオに適しています。靜的初期化ブロックとは異なり、インスタンス化されるたびに実行されますが、靜的初期化ブロックはクラスがロードされたときに1回のみ実行されます。

変數(shù)の「ファイナル」キーワードは何ですか? 変數(shù)の「ファイナル」キーワードは何ですか? Jun 24, 2025 pm 07:29 PM

Injava、thefinalkeywordpreventsavariaibleのValue frombeingededafterassignment、ButiTsbehiviordiffersforprimitivesandobjectReferences

工場(chǎng)のパターンとは何ですか? 工場(chǎng)のパターンとは何ですか? Jun 24, 2025 pm 11:29 PM

ファクトリーモードは、オブジェクトの作成ロジックをカプセル化するために使用され、コードをより柔軟でメンテナンスしやすく、ゆるく結(jié)合します。コアの答えは、オブジェクトの作成ロジックを一元的に管理し、実裝の詳細(xì)を隠し、複數(shù)の関連オブジェクトの作成をサポートすることです。特定の説明は次のとおりです。工場(chǎng)モードは、NewClass()の使用を直接回避し、処理のための特別な工場(chǎng)クラスまたは方法にオブジェクトの作成を手渡します。複數(shù)のタイプの関連オブジェクトが作成され、作成ロジックが変更され、実裝の詳細(xì)を非表示にする必要があるシナリオに適しています。たとえば、支払いプロセッサでは、Stripe、PayPal、その他のインスタンスが工場(chǎng)を通じて作成されます。その実裝には、入力パラメーターに基づいて工場(chǎng)クラスによって返されるオブジェクトが含まれ、すべてのオブジェクトは共通のインターフェイスを?qū)g現(xiàn)します。一般的なバリアントには、単純な工場(chǎng)、工場(chǎng)法、抽象的な工場(chǎng)が含まれます。これらは異なる複雑さに適しています。

タイプキャストとは何ですか? タイプキャストとは何ですか? Jun 24, 2025 pm 11:09 PM

変換には、暗黙的で明示的な変換には2つのタイプがあります。 1.暗黙的な変換は、INTを2倍に変換するなど、自動(dòng)的に発生します。 2。明示的な変換には、(int)mydoubleの使用など、手動(dòng)操作が必要です。タイプ変換が必要な場(chǎng)合には、ユーザー入力の処理、數(shù)學(xué)操作、または関數(shù)間のさまざまなタイプの値の渡されます。注意する必要がある問(wèn)題は次のとおりです。浮動(dòng)小數(shù)點(diǎn)數(shù)を整數(shù)に変換すると、分?jǐn)?shù)部分が切り捨てられ、大きなタイプを小さなタイプに変えるとデータの損失につながる可能性があり、一部の言語(yǔ)では特定のタイプの直接変換ができません。言語(yǔ)変換ルールを適切に理解することは、エラーを回避するのに役立ちます。

See all articles