关于响应式:在Spring-data中使用r2dbc

简介上篇文章咱们讲到了怎么在Spring webFlux中应用r2dbc,明天咱们看一下怎么应用spring-data-r2dbc这个Spring data对r2dbc的封装来进行r2dbc操作。 依赖关系要应用Spring-datea-r2dbc须要配置上面的依赖关系: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> <version>2.3.3.RELEASE</version> </dependency> <!-- R2DBC H2 Driver --> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <version>${r2dbc-h2.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>数据库连贯配置Spring-data-r2dbc应用的是R2dbcProperties来进行配置文件的读取: 简略看一下R2dbcProperties的定义: @ConfigurationProperties(prefix = "spring.r2dbc")public class R2dbcProperties { /** * Database name. Set if no name is specified in the url. Default to "testdb" when * using an embedded database. */ private String name; /** * Whether to generate a random database name. Ignore any configured name when * enabled. */ private boolean generateUniqueName; /** * R2DBC URL of the database. database name, username, password and pooling options * specified in the url take precedence over individual options. */ private String url; /** * Login username of the database. Set if no username is specified in the url. */ private String username; /** * Login password of the database. Set if no password is specified in the url. */ private String password;相应的,看一下咱们的配置文件是怎么样的: ...

November 28, 2020 · 2 min · jiezi

关于响应式:深入理解r2dbcmysql

简介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: ...

November 22, 2020 · 4 min · jiezi

关于响应式:深入理解h2和r2dbch2

简介本文将会介绍R2DBC的H2实现r2dbc-h2的应用办法和要留神的事项。一起来看看吧。 H2数据库简介什么是H2数据库呢? H2是一个Java SQL database,它是一个开源的数据库,运行起来十分快。 H2风行的起因是它既能够当做一个独立的服务器,也能够以一个嵌套的服务运行,并且反对纯内存模式运行。 H2的jar包十分小,只有2M大小,所以非常适合做嵌套式数据库。 如果作为嵌入式数据库,则须要将h2*.jar增加到classpath中。 上面是一个简略的建设H2连贯的代码: import java.sql.*;public class Test { public static void main(String[] a) throws Exception { Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", ""); // add application code here conn.close(); }}如果给定地址的数据库并不存在, 同时H2还提供了一个简略的治理界面,应用上面的命令就能够启动H2治理界面: java -jar h2*.jar默认状况下拜访http://localhost:8082就能够拜访到治理界面: r2dbc-h2r2dbc-h2是r2dbc spi的一种实现。同样的应用r2dbc-h2也提供了两种h2的模式,一种是文件系统,一种是内存。 同时还提供了事务反对,prepared statements和batch statements等个性的反对。 r2dbc-h2的Maven依赖要想应用r2dbc-h2,咱们须要增加如下依赖: <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <version>${version}</version></dependency>如果你体验snapshot版本,能够增加上面的依赖: <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</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>建设连贯h2有两种连贯形式,file和内存,咱们别离看一下都是怎么建设连贯的: ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:mem:///testdb");Publisher<? extends Connection> connectionPublisher = connectionFactory.create();ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:h2:file//my/relative/path");Publisher<? extends Connection> connectionPublisher = connectionFactory.create();咱们还能够通过ConnectionFactoryOptions来创立更加具体的连贯信息: ...

November 20, 2020 · 2 min · jiezi

关于响应式:响应式关系数据库处理R2DBC

简介之前咱们提到过,对于底层的数据源来说,MongoDB, Redis, 和 Cassandra 能够间接以reactive的形式反对Spring Data。而其余很多关系型数据库比方Postgres, Microsoft SQL Server, MySQL, H2 和 Google Spanner 则能够通过应用R2DBC 来实现对reactive的反对。 明天咱们就来具体解说一下R2DBC的应用。 R2DBC介绍之前咱们介绍了Reactor还有基于其之上的Spring WebFlux框架。包含vert.x,rxjava等等reactive技术。咱们实际上在应用层曾经有很多优良的响应式解决框架。 然而有一个问题就是所有的框架都须要获取底层的数据,而基本上关系型数据库的底层读写都还是同步的。 为了解决这个问题,呈现了两个规范,一个是oracle提出的 ADBC (Asynchronous Database Access API),另一个就是Pivotal提出的R2DBC (Reactive Relational Database Connectivity)。 R2DBC是基于Reactive Streams规范来设计的。通过应用R2DBC,你能够应用reactive API来操作数据。 同时R2DBC只是一个凋谢的规范,而各个具体的数据库连贯实现,须要实现这个规范。 明天咱们以r2dbc-h2为例,解说一下r2dbc在Spring webFlux中的应用。 我的项目依赖咱们须要引入r2dbc-spi和r2dbc-h2两个库,其中r2dbc-spi是接口,而r2dbc-h2是具体的实现。 同时咱们应用了Spring webflux,所以还须要引入spring-boot-starter-webflux。 具体的依赖如下: <!-- R2DBC H2 Driver --> <dependency> <groupId>io.r2dbc</groupId> <artifactId>r2dbc-h2</artifactId> <version>${r2dbc-h2.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>创立ConnectionFactoryConnectionFactory是数据库连贯的一个具体实现,通过ConnectionFactory咱们能够创立到数据库的连贯。 先看一下数据库的配置文件,为了不便起见,这里咱们应用的是内存数据库H2 : r2dbc.url=r2dbc:h2:mem://./r2dbcr2dbc.user=sar2dbc.password=password第一个url指定的是数据库的连贯形式,上面两个是数据库的用户名和明码。 接下来咱们看一下,怎么通过这些属性来创立ConnectionFactory: @Bean public ConnectionFactory connectionFactory() { ConnectionFactoryOptions baseOptions = ConnectionFactoryOptions.parse(url); ConnectionFactoryOptions.Builder ob = ConnectionFactoryOptions.builder().from(baseOptions); if (!StringUtil.isNullOrEmpty(user)) { ob = ob.option(USER, user); } if (!StringUtil.isNullOrEmpty(password)) { ob = ob.option(PASSWORD, password); } return ConnectionFactories.get(ob.build()); }通过url能够parse失去ConnectionFactoryOptions。而后通过ConnectionFactories的get办法创立ConnectionFactory。 ...

November 18, 2020 · 2 min · jiezi

关于响应式:Reactor中的Thread和Scheduler

简介明天咱们要介绍的是Reactor中的多线程模型和定时器模型,Reactor之前咱们曾经介绍过了,它实际上是观察者模式的延长。 所以从实质上来说,Reactor是和多线程无关的。你能够把它用在多线程或者不必在多线程。 明天将会给大家介绍一下如何在Reactor中应用多线程和定时器模型。 Thread多线程先看一下之前举的Flux的创立的例子: Flux<String> flux = Flux.generate( () -> 0, (state, sink) -> { sink.next("3 x " + state + " = " + 3*state); if (state == 10) sink.complete(); return state + 1; }); flux.subscribe(System.out::println);能够看到,不论是Flux generator还是subscriber,他们实际上都是运行在同一个线程中的。 如果咱们想让subscribe产生在一个新的线程中,咱们须要新启动一个线程,而后在线程外部进行subscribe操作。 Mono<String> mono = Mono.just("hello "); Thread t = new Thread(() -> mono .map(msg -> msg + "thread ") .subscribe(v -> System.out.println(v + Thread.currentThread().getName()) ) ); t.start(); t.join();下面的例子中,Mono在主线程中创立,而subscribe产生在新启动的Thread中。 ...

November 11, 2020 · 2 min · jiezi