日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

深入理解r2dbc在mysql中的使用

瀏覽:184日期:2023-10-05 15:14:39
簡介

mysql應該是我們在日常工作中使用到的一個非常普遍的數據庫,雖然mysql現在是oracle公司的,但是它是開源的,市場占有率還是非常高的。

今天我們將會介紹r2dbc在mysql中的使用。

r2dbc-mysql的maven依賴

要想使用r2dbc-mysql,我們需要添加如下的maven依賴:

<dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> <version>0.8.2.RELEASE</version></dependency>

當然,如果你想使用snapshot版本的話,可以這樣:

<dependency> <groupId>dev.miku</groupId> <artifactId>r2dbc-mysql</artifactId> <version>${r2dbc-mysql.version}.BUILD-SNAPSHOT</version></dependency><repository> <id>sonatype-snapshots</id> <name>SonaType Snapshots</name> <url>https://oss.sonatype.org/content/repositories/snapshots</url> <snapshots> <enabled>true</enabled> </snapshots></repository>創建connectionFactory

創建connectionFactory的代碼實際上使用的r2dbc的標準接口,所以和之前講到的h2的創建代碼基本上是一樣的:

// Notice: the query string must be URL encodedConnectionFactory connectionFactory = ConnectionFactories.get( 'r2dbcs:mysql://root:database-password-in-here@127.0.0.1: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=key-pem-password-in-here')// Creating a Mono using Project ReactorMono<Connection> connectionMono = Mono.from(connectionFactory.create());

不同的是ConnectionFactories傳入的參數不同。

我們也支持unix domain socket的格式:

// Minimum configuration for unix domain socketConnectionFactory connectionFactory = ConnectionFactories.get('r2dbc:mysql://root@unix?unixSocket=%2Fpath%2Fto%2Fmysql.sock')Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

同樣的,我們也支持從ConnectionFactoryOptions中創建ConnectionFactory:

ConnectionFactoryOptions options = ConnectionFactoryOptions.builder() .option(DRIVER, 'mysql') .option(HOST, '127.0.0.1') .option(USER, 'root') .option(PORT, 3306) // optional, default 3306 .option(PASSWORD, 'database-password-in-here') // optional, default null, null means has no password .option(DATABASE, 'r2dbc') // optional, default null, null means not specifying the database .option(CONNECT_TIMEOUT, Duration.ofSeconds(3)) // optional, default null, null means no timeout .option(SSL, true) // optional, default sslMode is 'preferred', it will be ignore if sslMode is set .option(Option.valueOf('sslMode'), 'verify_identity') // optional, default 'preferred' .option(Option.valueOf('sslCa'), '/path/to/mysql/ca.pem') // required when sslMode is verify_ca or verify_identity, default null, null means has no server CA cert .option(Option.valueOf('sslCert'), '/path/to/mysql/client-cert.pem') // optional, default null, null means has no client cert .option(Option.valueOf('sslKey'), '/path/to/mysql/client-key.pem') // optional, default null, null means has no client key .option(Option.valueOf('sslKeyPassword'), 'key-pem-password-in-here') // optional, default null, null means has no password for client key (i.e. 'sslKey') .option(Option.valueOf('tlsVersion'), 'TLSv1.3,TLSv1.2,TLSv1.1') // optional, default is auto-selected by the server .option(Option.valueOf('sslHostnameVerifier'), 'com.example.demo.MyVerifier') // optional, default is null, null means use standard verifier .option(Option.valueOf('sslContextBuilderCustomizer'), 'com.example.demo.MyCustomizer') // optional, default is no-op customizer .option(Option.valueOf('zeroDate'), 'use_null') // optional, default 'use_null' .option(Option.valueOf('useServerPrepareStatement'), true) // optional, default false .option(Option.valueOf('tcpKeepAlive'), true) // optional, default false .option(Option.valueOf('tcpNoDelay'), true) // optional, default false .option(Option.valueOf('autodetectExtensions'), false) // optional, default false .build();ConnectionFactory connectionFactory = ConnectionFactories.get(options);// Creating a Mono using Project ReactorMono<Connection> connectionMono = Mono.from(connectionFactory.create());

或者下面的unix domain socket格式:

// Minimum configuration for unix domain socketConnectionFactoryOptions options = ConnectionFactoryOptions.builder() .option(DRIVER, 'mysql') .option(Option.valueOf('unixSocket'), '/path/to/mysql.sock') .option(USER, 'root') .build();ConnectionFactory connectionFactory = ConnectionFactories.get(options);Mono<Connection> connectionMono = Mono.from(connectionFactory.create());使用MySqlConnectionFactory創建connection

上面的例子中,我們使用的是通用的r2dbc api來創建connection,同樣的,我們也可以使用特有的MySqlConnectionFactory來創建connection:

MySqlConnectionConfiguration configuration = MySqlConnectionConfiguration.builder() .host('127.0.0.1') .user('root') .port(3306) // optional, default 3306 .password('database-password-in-here') // optional, default null, null means has no password .database('r2dbc') // optional, default null, null means not specifying the database .serverZoneId(ZoneId.of('Continent/City')) // optional, default null, null means query server time zone when connection init .connectTimeout(Duration.ofSeconds(3)) // optional, default null, null means no timeout .sslMode(SslMode.VERIFY_IDENTITY) // optional, default SslMode.PREFERRED .sslCa('/path/to/mysql/ca.pem') // required when sslMode is VERIFY_CA or VERIFY_IDENTITY, default null, null means has no server CA cert .sslCert('/path/to/mysql/client-cert.pem') // optional, default has no client SSL certificate .sslKey('/path/to/mysql/client-key.pem') // optional, default has no client SSL key .sslKeyPassword('key-pem-password-in-here') // optional, default has no client SSL key password .tlsVersion(TlsVersions.TLS1_3, TlsVersions.TLS1_2, TlsVersions.TLS1_1) // optional, default is auto-selected by the server .sslHostnameVerifier(MyVerifier.INSTANCE) // optional, default is null, null means use standard verifier .sslContextBuilderCustomizer(MyCustomizer.INSTANCE) // optional, default is no-op customizer .zeroDateOption(ZeroDateOption.USE_NULL) // optional, default ZeroDateOption.USE_NULL .useServerPrepareStatement() // Use server-preparing statements, default use client-preparing statements .tcpKeepAlive(true) // optional, controls TCP Keep Alive, default is false .tcpNoDelay(true) // optional, controls TCP No Delay, default is false .autodetectExtensions(false) // optional, controls extension auto-detect, default is true .extendWith(MyExtension.INSTANCE) // optional, manual extend an extension into extensions, default using auto-detect .build();ConnectionFactory connectionFactory = MySqlConnectionFactory.from(configuration);// Creating a Mono using Project ReactorMono<Connection> connectionMono = Mono.from(connectionFactory.create());

或者下面的unix domain socket方式:

// Minimum configuration for unix domain socketMySqlConnectionConfiguration configuration = MySqlConnectionConfiguration.builder() .unixSocket('/path/to/mysql.sock') .user('root') .build();ConnectionFactory connectionFactory = MySqlConnectionFactory.from(configuration);Mono<Connection> connectionMono = Mono.from(connectionFactory.create());執行statement

首先看一個簡單的不帶參數的statement:

connection.createStatement('INSERT INTO `person` (`first_name`, `last_name`) VALUES (’who’, ’how’)') .execute(); // return a Publisher include one Result

然后看一個帶參數的statement:

connection.createStatement('INSERT INTO `person` (`birth`, `nickname`, `show_name`) VALUES (?, ?name, ?name)') .bind(0, LocalDateTime.of(2019, 6, 25, 12, 12, 12)) .bind('name', 'Some one') // Not one-to-one binding, call twice of native index-bindings, or call once of name-bindings. .add() .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12)) .bind(1, 'My Nickname') .bind(2, 'Naming show') .returnGeneratedValues('generated_id') .execute(); // return a Publisher include two Results.

注意,如果參數是null的話,可以使用bindNull來進行null值的綁定。

接下來我們看一個批量執行的操作:

connection.createBatch() .add('INSERT INTO `person` (`first_name`, `last_name`) VALUES (’who’, ’how’)') .add('UPDATE `earth` SET `count` = `count` + 1 WHERE `id` = ’human’') .execute(); // return a Publisher include two Results.執行事務

我們看一個執行事務的例子:

connection.beginTransaction() .then(Mono.from(connection.createStatement('INSERT INTO `person` (`first_name`, `last_name`) VALUES (’who’, ’how’)').execute())) .flatMap(Result::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', 'Some one') .add() .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12)) .bind(1, 'My Nickname') .bind(2, 'Naming show') .returnGeneratedValues('generated_id') .execute()) .flatMap(Result::getRowsUpdated) .then(connection.commitTransaction());使用線程池

為了提升數據庫的執行效率,減少建立連接的開銷,一般數據庫連接都會有連接池的概念,同樣的r2dbc也有一個叫做r2dbc-pool的連接池。

r2dbc-pool的依賴:

<dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-pool</artifactId> <version>${version}</version></dependency>

如果你想使用snapshot版本,也可以這樣指定:

<dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-pool</artifactId> <version>${version}.BUILD-SNAPSHOT</version></dependency><repository> <id>spring-libs-snapshot</id> <name>Spring Snapshot Repository</name> <url>https://repo.spring.io/libs-snapshot</url></repository>

看一下怎么指定數據庫連接池:

ConnectionFactory connectionFactory = ConnectionFactories.get('r2dbc:pool:<my-driver>://<host>:<port>/<database>[?maxIdleTime=PT60S[&…]');Publisher<? extends Connection> connectionPublisher = connectionFactory.create();

可以看到,我們只需要在連接URL上面添加pool這個driver即可。

同樣的,我們也可以通過ConnectionFactoryOptions來創建:

ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder() .option(DRIVER, 'pool') .option(PROTOCOL, 'postgresql') // driver identifier, PROTOCOL is delegated as DRIVER by the pool. .option(HOST, '…') .option(PORT, '…') .option(USER, '…') .option(PASSWORD, '…') .option(DATABASE, '…') .build());Publisher<? extends Connection> connectionPublisher = connectionFactory.create();// Alternative: Creating a Mono using Project ReactorMono<Connection> connectionMono = Mono.from(connectionFactory.create());

最后, 你也可以直接通過創建ConnectionPoolConfiguration來使用線程池:

ConnectionFactory connectionFactory = …;ConnectionPoolConfiguration configuration = ConnectionPoolConfiguration.builder(connectionFactory) .maxIdleTime(Duration.ofMillis(1000)) .maxSize(20) .build();ConnectionPool pool = new ConnectionPool(configuration); Mono<Connection> connectionMono = pool.create();// laterConnection connection = …;Mono<Void> release = connection.close(); // released the connection back to the pool// application shutdownpool.dispose();

到此這篇關于深入理解r2dbc在mysql中的使用的文章就介紹到這了,更多相關mysql r2dbc 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99riav1国产精品视频| 日韩欧美中文字幕一区二区三区| 午夜一区在线| 美女国产一区二区三区| 国产精品日本| 国产传媒在线| 综合五月婷婷| 在线综合亚洲| av亚洲一区二区三区| 日韩不卡在线观看日韩不卡视频| 国产精品magnet| 国产亚洲精品美女久久| 日韩大片在线观看| 国产欧美午夜| 黑丝一区二区| 亚洲电影有码| 日本一区二区高清不卡| 国产毛片久久| 精品日韩毛片| 91精品亚洲| 91tv亚洲精品香蕉国产一区| 国内不卡的一区二区三区中文字幕| 丝袜诱惑制服诱惑色一区在线观看| 久久人人88| 亚洲福利久久| 99pao成人国产永久免费视频| 伊人成人网在线看| 国产欧美高清视频在线| 久久女人天堂| 91亚洲国产| 99在线观看免费视频精品观看| 日韩欧美一区免费| 99精品综合| 亲子伦视频一区二区三区| 999久久久精品国产| 日本不卡免费高清视频在线| 日本在线精品| 亚洲精品少妇| 国产精品伊人| 91精品亚洲| 在线观看亚洲精品福利片| 日韩在线麻豆| 中文在线а√天堂 | 久久视频国产| 欧美日韩三区| 日韩欧美三区| 国产欧美一区二区三区国产幕精品 | 欧美www视频在线观看| 国产在线看片免费视频在线观看| 久久久久久黄| 日韩av一二三| 亚洲婷婷免费| 在线一区视频观看| 一区二区三区网站| 四虎成人av| 欧美精品影院| 红桃视频国产精品| 麻豆成人在线观看| 激情综合网五月| 欧美精品97| 日韩一区精品| 激情91久久| 国产日韩电影| 久久三级中文| 欧美一区不卡| 日韩中文字幕亚洲一区二区va在线 | 久久国产高清| 日韩免费视频| 国产精品宾馆| 青青草伊人久久| 亚洲bt欧美bt精品777| 日韩欧美激情| 国产精品午夜av| 欧美国产一级| 午夜久久福利| 免费日本视频一区| 亚洲麻豆一区| 麻豆国产精品视频| 激情黄产视频在线免费观看| 久久免费高清| 在线观看一区| 麻豆久久久久久| 蜜臀av一区二区在线免费观看| 日本午夜精品久久久久| 欧美黄页在线免费观看| 97在线精品| 亚洲1区在线| 色在线中文字幕| 91精品国产自产精品男人的天堂 | 老鸭窝亚洲一区二区三区| 欧美另类中文字幕| 亚洲一本视频| 国产极品一区| 日韩午夜黄色| 精品国产不卡| 天海翼亚洲一区二区三区| 国产精品亚洲片在线播放| 久久国产成人| 婷婷亚洲五月| 欧美xxxx中国| 欧美精品不卡| 青青青国产精品| 三级在线看中文字幕完整版| 久久狠狠亚洲综合| 美女精品视频在线| 欧美另类中文字幕| 97久久亚洲| 免费不卡在线视频| 蜜臀av一区二区在线免费观看| 久久三级视频| 久久久久欧美精品| 亚洲v在线看| 婷婷综合六月| 美女av在线免费看| 毛片不卡一区二区| 国产精品扒开腿做爽爽爽软件| 黄色亚洲免费| 欧美三区四区| 亚洲成a人片| 欧美成人a交片免费看| 日韩精品不卡一区二区| 成人啊v在线| 国产精品91一区二区三区| 亚洲福利一区| 亚洲视频播放| 一区二区三区四区日韩| 日韩高清中文字幕一区| 久久电影一区| 欧美一区=区三区| 久久久精品国产**网站| 国产精品yjizz视频网| 天堂av在线| 国产精品99一区二区| 日韩午夜一区| 欧美日本久久| 国产成人免费| 91九色精品| 日韩成人精品一区二区三区 | 久久麻豆精品| 黄色av一区| 久久国内精品自在自线400部| 欧美日韩在线二区| 色婷婷亚洲mv天堂mv在影片| 91精品国产乱码久久久久久久| 香蕉成人久久| 久久99免费视频| 在线日韩视频| 国产精品4hu.www| 日韩午夜在线| 亚洲精品乱码日韩| 色在线中文字幕| 日韩欧美中文字幕一区二区三区 | 香蕉久久99| 国产三级一区| 久久精品导航| 蜜臀久久99精品久久久久久9 | 香蕉人人精品| 日韩高清在线不卡| 91精品啪在线观看国产18 | 欧美激情一区| 亚洲主播在线| 亚洲黄色免费av| 亚洲精品日本| 亚洲成人不卡| 久久精品国产一区二区| 亚洲va中文在线播放免费| 午夜天堂精品久久久久| 精品一区欧美| 精品亚洲a∨一区二区三区18| 丝袜国产日韩另类美女| 精品免费av在线| 日韩专区欧美专区| 久久免费大视频| 91视频久久| 色在线中文字幕| 91成人精品在线| 日本高清久久| 日韩精品社区| 国产亚洲在线观看| 亚洲午夜久久久久久尤物 | 久久av偷拍| 国产精品片aa在线观看| 视频一区二区三区入口| 国产高清一区二区| 热三久草你在线| 欧美三区四区| 激情黄产视频在线免费观看| 国产精品chinese| 精品美女视频| 1000部精品久久久久久久久| 国产精品不卡| 精品捆绑调教一区二区三区| 欧美日韩激情| 99久久精品国产亚洲精品| 色综合www| 噜噜噜躁狠狠躁狠狠精品视频| 日本在线视频一区二区| 欧美日韩一区二区三区在线电影| 蜜臀久久99精品久久久久宅男| 伊人久久大香伊蕉在人线观看热v|