search
LoginSignup
0
Help us understand the problem. What are the problem?
Organization

【Spring WebFlux】jOOQはReactive Contextにアクセスできない【R2DBC】

TL;DR

  • jOOQReactorに依存しないため、jOOQ内の処理からはReactor固有の機能(Reactive Context1)にアクセスできない2
    • これによって期待したような結果が得られない場合が有る
  • この問題を回避するには都度Connectionを取得してDSLContextを発行する形が有効

ConnectionFactoryからDSLContextを初期化する際に起きる問題

jOOQの公式ブログでは、R2DBCを利用する際のサンプルコードとしてConnectionFactoryからDSLContextを初期化する例が紹介されています。

記事に掲載されているサンプルコード
ConnectionFactory connectionFactory = ConnectionFactories.get(
   ConnectionFactoryOptions
       .parse("r2dbc:h2:file://localhost/~/r2dbc-test")
       .mutate()
       .option(ConnectionFactoryOptions.USER, "sa")
       .option(ConnectionFactoryOptions.PASSWORD, "")
       .build()
);
DSLContext ctx = DSL.using(connectionFactory);

一方、この形で初期化したDSLContextSpring WebFluxで利用すると、Springが提供するReactiveTransactionManagerによるトランザクションが効かなかったり、R2DBC PoolによるLifecycleサポート内からReactive Contextにアクセスできないといった問題が発生します。

何故こうなるのか

jOOQReactive Streamsのみに依存して実装実装する方針を採っています。
一方、ReactorReactive Streamsを拡張して実装されたプロジェクトであり、Reactive ContextReactor固有の機能です。
このため、jOOQを介した場合Reactive Contextは失われてしまいます。
また、ReactiveTransactionManagerReactive Contextに依存した機能であり、jOOQの内側から利用することはできません。

この問題はjOOQの設計方針上不可避で、Reactive StreamsReactorの両方に共通のコンテキスト機能が入りでもしない限りは解決されないものと思われます。

対策方法

それでもjOOQを使う場合、Reactive Contextが有効なスコープでConnectionを発行し、Connectionから初期化したDSLContextを使い回す方法で対策できます。
例に関しては自分の過去記事をご参照下さい。

  1. この機能はドキュメント上単にContextと呼称されていますが、分かりやすさのためこの記事ではReactive Contextと呼称します。

  2. この記事はjOOQ 3.16.10現在の話です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0
Help us understand the problem. What are the problem?