R2DBC는 커넥션 풀 라이브러리를 제공한다. 이 라이브러릴 사용하면 어렵지 않게 R2DBC에 대한 커넥션 풀을 설정할 수 있다.
의존 설정
커넥션 풀을 설정하려면 r2dbc-pool 모듈을 추가한다.
<dependency>
<groupId>io.r2dbc</groupId>
<artifactId>r2dbc-pool</artifactId>
<version>0.8.0.RELEASE</version>
</dependency>
URL로 커넥션 풀 사용하기
커넥션 풀을 사용하는 가장 쉬운 방법은 URL에 pool을 사용하는 것이다.
String url = "r2dbcs:pool:mysql://root:1@localhost:3306/test";
ConnectionFactory connectionFactory = ConnectionFactories.get(url);
Mono<Integer> updatedMono = Mono.from(connectionFactory.create())
.flatMap(conn -> {
Mono<Void> txMono = Mono.from(conn.beginTransaction());
...
return updMono.delayUntil(ret -> conn.commitTransaction())
.onErrorResume(err -> Mono.from(conn.rollbackTransaction())
.then(Mono.error(err)))
.doFinally(signal -> Mono.from(conn.close()).subscribe());
});
URL의 드라이버 위치에 "pool"을 사용했고 나머지는 동일하다. URL을 사용하면 초기 크기나 최대 크기 기본값으로 10을 사용한다.
ConnectionFactoryOptions로 커넥션 풀 사용하기
커넥션 풀의 초기 크기, 최대 크기, 검증 쿼리를 직접 제어하고 싶다면 ConnectionFactoryOptions를 이용해서 ConnectionFactory를 생성하면 된다. 아래 코드는 사용 예이다.
ConnectionFactory connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
.option(ConnectionFactoryOptions.SSL, true)
.option(ConnectionFactoryOptions.DRIVER, "pool")
.option(ConnectionFactoryOptions.PROTOCOL, "mysql")
.option(ConnectionFactoryOptions.HOST, "localhost")
.option(ConnectionFactoryOptions.PORT, 3306)
.option(ConnectionFactoryOptions.USER, "root")
.option(ConnectionFactoryOptions.PASSWORD, "1")
.option(ConnectionFactoryOptions.DATABASE, "test")
.option(Option.<Integer>valueOf("initialSize"), 5)
.option(Option.<Integer>valueOf("maxSize"), 20)
.option(Option.<String>valueOf("validationQuery"), "select 1+1")
.build());
DRIVER 옵션 값은 "pool"로 지정하고 PROTOCOL 옵션에 실제 드라이버를 지정한다.
ConnectionPool 클래스로 커넥션 풀 사용하기
커넥션 풀에 대해 보다 상세한 설정을 하고 싶다면 ConnectionPool 클래스를 이용해서 커넥션 풀을 생성한다. 다음은 사용 예를 보여준다.
String url = "r2dbcs:mysql://root:1@localhost:3306/test";
ConnectionFactory connectionFactory = ConnectionFactories.get(url);
ConnectionPoolConfiguration configuration = ConnectionPoolConfiguration.builder(connectionFactory)
.initialSize(5)
.maxSize(20)
.maxIdleTime(Duration.ofMinutes(10))
.maxLifeTime(Duration.ofMinutes(60))
.maxCreateConnectionTime(Duration.ofMillis(500))
.maxAcquireTime(Duration.ofMillis(500))
.validationDepth(ValidationDepth.LOCAL)
.validationQuery("select 1+1")
.name("POOL 01")
.build();
ConnectionPool pool = new ConnectionPool(configuration);
Mono<Integer> updatedMono = Mono.from(pool.create())
.flatMap(conn -> {
Mono<Void> txMono = Mono.from(conn.beginTransaction());
...
return updMono.delayUntil(ret -> conn.commitTransaction())
.onErrorResume(err -> Mono.from(conn.rollbackTransaction())
.then(Mono.error(err)))
.doFinally(signal -> Mono.from(conn.close()).subscribe());
});
ConnectionPoolConfiguration은 커넥션 풀 설정 정보를 담는다. ConnectionPoolConfiguration.builder() 메서드는 커넥션을 생성할 때 사용할 ConnectionFactory를 인자로 받으며 이후 initialSize(), maxSize() 등의 메서드를 이용해서 커넥션 풀을 설정한다.
설정한 ConnectionPoolConfiguration을 이용해서 ConnectionPool 객체를 생성한 뒤 ConnectionFactory 대신에 ConnectionPool을 이용해서 커넥션을 구하면 된다.