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

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

光プールとは何ですか?

Jan 07, 2025 pm 04:08 PM

O que é o hikari pool?

光プールとは何ですか?

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

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

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

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

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

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

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

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

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

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

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

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

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

JDBCデータベースへの接続

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

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

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

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

データベースと通信するために JDBC 接続を確立する必要がある場合がありました。ただし、私の 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 は「慣用的な」から來ています。慣用的なコードを持つという考え方は、まさに「不必要な精神的負(fù)荷を軽減する」ためです。

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

この場合、次のことから始めます:

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

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

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

-- 1, 'first', NULL

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

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

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

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

問題のプロジェクトは Pstmt Null Safe です?;镜膜恕ava クラスローダーには、jar をロードするときに META-INF というメタデータ フォルダーを検索するという魔法があります。 JDBC ドライバーの場合は、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) を通じて行われます。ドライバーに接続を受け入れるかどうかを問い合わせるための 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'

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

public static final PstmtNullSafeDriver instance;

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

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

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

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

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

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

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

jdbc:sqlite::memory:

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

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

jdbc:pstmt-nullsafe:sqlite::memory:

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

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

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

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

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

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

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

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

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'

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

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

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

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

ヒカリCPとは何ですか?

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

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

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

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

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

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

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

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Injava、thefinalkeywordpreventsavariaibleのValue frombeingededafterassignment、ButiTsbehiviordiffersforprimitivesandobjectReferences

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

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

See all articles