導入MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 Oracle が所有していますが、オープンソースであり、その市場シェアは依然として非常に高いです。 今日は、mysql での r2dbc の使用法を紹介します。 r2dbc-mysql の Maven 依存関係r2dbc-mysql を使用するには、次の Maven 依存関係を追加する必要があります。 <依存関係> <groupId>dev.miku</groupId> <アーティファクトID>r2dbc-mysql</アーティファクトID> <バージョン>0.8.2.RELEASE</バージョン> </依存関係> もちろん、スナップショット バージョンを使用したい場合は、次のようにします。 <依存関係> <groupId>dev.miku</groupId> <アーティファクトID>r2dbc-mysql</アーティファクトID> <バージョン>${r2dbc-mysql.バージョン}.BUILD-SNAPSHOT</バージョン> </依存関係> <リポジトリ> <id>sonatype スナップショット</id> <name>SonaType スナップショット</name> <url>https://oss.sonatype.org/content/repositories/snapshots</url> <スナップショット> <enabled>有効</enabled> </スナップショット> </リポジトリ> connectionFactory の作成connectionFactory を作成するためのコードは、実際には r2dbc の標準インターフェースを使用するため、基本的には前述の h2 の作成コードと同じです。 // 注意: クエリ文字列は URL エンコードされている必要があります 接続ファクトリー connectionFactory = 接続ファクトリー.get( "r2dbcs:mysql://root:[email protected]:3306/r2dbc?" + "zeroDate=use_round&" + "sslMode=verify_identity&" + "useServerPrepareStatement=true&" + "tlsVersion=TLSv1.3%2CTLSv1.2%2CTLSv1.1&" + "sslCa=%2Fpath%2Fto%2Fmysql%2Fca.pem&" + "sslKey=%2Fpath%2Fto%2Fmysql%2Fclient-key.pem&" + "sslCert=%2Fpath%2Fto%2Fmysql%2Fclient-cert.pem&" + "sslKeyPassword=キーpemパスワードをここに入力" ) // Project Reactor を使用して Mono を作成する Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); 違いは、ConnectionFactories によって渡されるパラメータが異なることです。 Unix ドメイン ソケット形式もサポートしています。 // Unix ドメイン ソケットの最小構成 接続ファクトリー connectionFactory = ConnectionFactories.get("r2dbc:mysql://root@unix?unixSocket=%2Fpath%2Fto%2Fmysql.sock") Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); 同様に、ConnectionFactoryOptions から ConnectionFactory を作成することもサポートしています。 ConnectionFactoryOptions オプション = ConnectionFactoryOptions.builder() .option(DRIVER, "mysql") .option(ホスト, "127.0.0.1") .option(USER, "root") .option(PORT, 3306) // オプション、デフォルトは3306 .option(PASSWORD, "database-password-in-here") // オプション、デフォルトは null、null はパスワードがないことを意味します .option(DATABASE, "r2dbc") // オプション、デフォルトは null、null はデータベースを指定しないことを意味します .option(CONNECT_TIMEOUT, Duration.ofSeconds(3)) // オプション、デフォルトは null、null はタイムアウトなしを意味します .option(SSL, true) // オプション、デフォルトの sslMode は「preferred」です。sslMode が設定されている場合は無視されます。 .option(Option.valueOf("sslMode"), "verify_identity") // オプション、デフォルトは "preferred" .option(Option.valueOf("sslCa"), "/path/to/mysql/ca.pem") // sslMode が verify_ca または verify_identity の場合に必須、デフォルトは null、null はサーバ CA 証明書がないことを意味します .option(Option.valueOf("sslCert"), "/path/to/mysql/client-cert.pem") // オプション、デフォルトは null、null はクライアント証明書がないことを意味します .option(Option.valueOf("sslKey"), "/path/to/mysql/client-key.pem") // オプション、デフォルトは null、null はクライアント キーがないことを意味します .option(Option.valueOf("sslKeyPassword"), "key-pem-password-in-here") // オプション、デフォルトは null、null はクライアント キー (つまり "sslKey") のパスワードがないことを意味します .option(Option.valueOf("tlsVersion"), "TLSv1.3,TLSv1.2,TLSv1.1") // オプション、デフォルトはサーバーによって自動的に選択されます .option(Option.valueOf("sslHostnameVerifier"), "com.example.demo.MyVerifier") // オプション、デフォルトは null、null は標準の検証子を使用することを意味します .option(Option.valueOf("sslContextBuilderCustomizer"), "com.example.demo.MyCustomizer") // オプション、デフォルトは何もしないカスタマイザー .option(Option.valueOf("zeroDate"), "use_null") // オプション、デフォルトは "use_null" .option(Option.valueOf("useServerPrepareStatement"), true) // オプション、デフォルトは false .option(Option.valueOf("tcpKeepAlive"), true) // オプション、デフォルトは false .option(Option.valueOf("tcpNoDelay"), true) // オプション、デフォルトは false .option(Option.valueOf("autodetectExtensions"), false) // オプション、デフォルトは false 。建てる(); 接続ファクトリー connectionFactory = ConnectionFactories.get(オプション); // Project Reactor を使用して Mono を作成する Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); または、次の Unix ドメイン ソケット形式: // Unix ドメイン ソケットの最小構成 ConnectionFactoryOptions オプション = ConnectionFactoryOptions.builder() .option(DRIVER, "mysql") .option(Option.valueOf("unixSocket"), "/path/to/mysql.sock") .option(USER, "root") 。建てる(); 接続ファクトリー connectionFactory = ConnectionFactories.get(オプション); Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); MySqlConnectionFactory を使用して接続を作成する上記の例では、一般的な r2dbc API を使用して接続を作成しています。同様に、独自の MySqlConnectionFactory を使用して接続を作成することもできます。 MySqlConnectionConfiguration 構成 = MySqlConnectionConfiguration.builder() .ホスト("127.0.0.1") .user("ルート") .port(3306) // オプション、デフォルトは3306 .password("database-password-in-here") // オプション、デフォルトは null、null はパスワードがないことを意味します .database("r2dbc") // オプション、デフォルトは null、null はデータベースを指定しないことを意味します .serverZoneId(ZoneId.of("Continent/City")) // オプション、デフォルトは null、null は接続開始時にサーバーのタイムゾーンを照会することを意味します .connectTimeout(Duration.ofSeconds(3)) // オプション、デフォルトは null、null はタイムアウトなしを意味します .sslMode(SslMode.VERIFY_IDENTITY) // オプション、デフォルト SslMode.PREFERRED .sslCa("/path/to/mysql/ca.pem") // sslMode が VERIFY_CA または VERIFY_IDENTITY の場合に必須、デフォルトは null、null はサーバー CA 証明書がないことを意味します .sslCert("/path/to/mysql/client-cert.pem") // オプション、デフォルトではクライアント SSL 証明書はありません .sslKey("/path/to/mysql/client-key.pem") // オプション、デフォルトではクライアント SSL キーはありません .sslKeyPassword("key-pem-password-in-here") // オプション、デフォルトではクライアント SSL キー パスワードはありません .tlsVersion(TlsVersions.TLS1_3, TlsVersions.TLS1_2, TlsVersions.TLS1_1) // オプション、デフォルトはサーバーによって自動的に選択されます .sslHostnameVerifier(MyVerifier.INSTANCE) // オプション、デフォルトは null、null は標準の検証子を使用することを意味します .sslContextBuilderCustomizer(MyCustomizer.INSTANCE) // オプション、デフォルトは何もしないカスタマイザー .zeroDateOption(ZeroDateOption.USE_NULL) // オプション、デフォルトは ZeroDateOption.USE_NULL .useServerPrepareStatement() // サーバー準備ステートメントを使用します。デフォルトではクライアント準備ステートメントを使用します。 .tcpKeepAlive(true) // オプション、TCP キープアライブを制御します。デフォルトは false です .tcpNoDelay(true) // オプション、TCP 遅延なしを制御します。デフォルトは false です .autodetectExtensions(false) // オプション、拡張子の自動検出を制御します。デフォルトは true です .extendWith(MyExtension.INSTANCE) // オプション、拡張機能を手動で拡張機能に拡張します。デフォルトでは自動検出を使用します 。建てる(); 接続ファクトリー connectionFactory = MySqlConnectionFactory.from(構成); // Project Reactor を使用して Mono を作成する Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); または、次の Unix ドメイン ソケット メソッド: // Unix ドメイン ソケットの最小構成 MySqlConnectionConfiguration 構成 = MySqlConnectionConfiguration.builder() .unixSocket("/path/to/mysql.sock") .user("ルート") 。建てる(); 接続ファクトリー connectionFactory = MySqlConnectionFactory.from(構成); Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); ステートメントを実行するまず、パラメータのない単純なステートメントを見てみましょう。 connection.createStatement("INSERT INTO `person` (`first_name`, `last_name`) VALUES ('who', 'how')") .execute(); // 1つのResultを含むPublisherを返す 次に、パラメータ付きのステートメントを見てみましょう。 connection.createStatement("`person` (`birth`, `nickname`, `show_name`) VALUES (?, ?name, ?name) に INSERT INTO") .bind(0, LocalDateTime.of(2019, 6, 25, 12, 12, 12)) .bind("name", "Some one") // 1対1のバインディングではなく、ネイティブのインデックスバインディングを2回呼び出すか、名前バインディングを1回呼び出します。 。追加() .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12)) .bind(1, "私のニックネーム") .bind(2, "名前の表示") .returnGeneratedValues("生成されたID") .execute(); // 2 つの結果を含む Publisher を返します。 パラメータが null の場合、bindNull を使用して null 値をバインドできることに注意してください。 次に、バッチ実行操作を見てみましょう。 接続.createBatch() .add("`person` (`first_name`, `last_name`) に VALUES ('who', 'how') を挿入") .add("`earth` を更新し、`count` = `count` + 1 を設定し、`id` = 'human' を設定します") .execute(); // 2 つの結果を含む Publisher を返します。 取引の実行トランザクションを実行する例を見てみましょう。 接続.beginTransaction() .then(Mono.from(connection.createStatement("INSERT INTO `person` (`first_name`, `last_name`) VALUES ('who', 'how')").execute())) .flatMap(結果::getRowsUpdated) .thenMany(connection.createStatement("INSERT INTO `person` (`birth`, `nickname`, `show_name`) VALUES (?, ?name, ?name)") .bind(0, LocalDateTime.of(2019, 6, 25, 12, 12, 12)) .bind("name", "誰か") 。追加() .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12)) .bind(1, "私のニックネーム") .bind(2, "名前の表示") .returnGeneratedValues("生成されたID") 。実行する()) .flatMap(結果::getRowsUpdated) .then(接続.commitTransaction()); スレッドプールの使用データベースの実行効率を向上させ、接続を確立する際のオーバーヘッドを削減するために、一般的なデータベース接続には接続プールの概念が設けられています。同様に、r2dbc にも r2dbc-pool と呼ばれる接続プールがあります。 r2dbc-pool の依存関係: <依存関係> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-プール</artifactId> <バージョン>${バージョン}</バージョン> </依存関係> スナップショット バージョンを使用する場合は、次のように指定することもできます。 <依存関係> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-プール</artifactId> <version>${version}.BUILD-SNAPSHOT</version> </依存関係> <リポジトリ> <id>spring-libs-スナップショット</id> <name>Spring スナップショット リポジトリ</name> <url>https://repo.spring.io/libs-snapshot</url> </リポジトリ> データベース接続プールを指定する方法を見てみましょう。 ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:pool:<my-driver>://<host>:<port>/<database>[?maxIdleTime=PT60S[&…]"); パブリッシャー<? extends Connection> connectionPublisher = connectionFactory.create(); ご覧のとおり、接続 URL にプール ドライバーを追加するだけで済みます。 同様に、ConnectionFactoryOptions を通じて作成することもできます。 接続ファクトリー connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder() .option(DRIVER, "プール") .option(PROTOCOL, "postgresql") // ドライバー識別子。PROTOCOL はプールによって DRIVER として委任されます。 .option(HOST, "…") .option(ポート, "…") .option(USER, "...") .option(パスワード, "…") .option(データベース, "…") 。建てる()); パブリッシャー<? extends Connection> connectionPublisher = connectionFactory.create(); // 代替案: Project Reactor を使用して Mono を作成する Mono<Connection> connectionMono = Mono.from(connectionFactory.create()); 最後に、ConnectionPoolConfiguration を作成してスレッド プールを直接使用することもできます。 接続ファクトリー connectionFactory = ...; ConnectionPoolConfiguration 構成 = ConnectionPoolConfiguration.builder(connectionFactory) .maxIdleTime(持続時間.ofMillis(1000)) .最大サイズ(20) 。建てる(); ConnectionPool プール = 新しい ConnectionPool(構成); Mono<接続> connectionMono = pool.create(); // 後で 接続接続 = …; Mono<Void> release = connection.close(); // 接続をプールに戻しました // アプリケーションのシャットダウン プールを破棄します。 これで、mysql での r2dbc の使用に関する詳細な理解に関するこの記事は終了です。より関連性の高い mysql r2dbc コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Dockerビルドキットを使用して、Raspberry Piで使用できるDockerイメージを構築します。
ステップ: 1. 仮想マシンディレクトリに新しいdocker-compose.ymlファイルを作成し...
多くの場合、bash スクリプト内またはスクリプト自体内で直接 sudo を使用してコマンドを実行す...
当初の意図は、element-ui の $notify 通知をコンポーネントにカプセル化することでし...
まず、効果図の下にコードを添付します <!DOCTYPE html> <html&...
目次1. docker-maven-pluginの紹介2. 環境とソフトウェアの準備3. デモ例3....
目次1. 問題を発見する2.重複したデータを残さずにすべて削除する3. 削除テーブルから重複データを...
Grid は 2 次元のグリッド レイアウト システムです。これを使用すると、本質的にはハック メソ...
目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...
<br />英語アドレス: http://developer.yahoo.com/per...
div で background-color と background-image を同時に設定する...
ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...
目次1 v-ifとv-showの使用2. 計算と監視を区別する3 v-for トラバーサルでは、アイ...
概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...
Linux インストール MySQL ノート1. MySQL データベース サーバーをインストールす...
ブラウザが IE のどのバージョンであるかを検出するためによく使用される JavaScript コー...