주요글: 도커 시작하기

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을 이용해서 커넥션을 구하면 된다.

+ Recent posts