Riderが便利なのでちょいちょいと使うのですが。外部キーをたくさん使っていると実行が遅くなるという問題に悩まされたことがあったので、メモしておきます。Riderは、テストメソッドに@DataSetアノテーションを指定することでテスト実行前にデータのセットアップができます。Configuration@DataSetアノテーションにはuseSequenceFilteringという属性があり、こちらをtrueにすることでテーブル間の依存関係を調べてデータを正しい順番で登録してくれます。https://github.com/database-rider/database-rider/blob/1.41.0/rider-core/src/main/java/com/github/database/rider/core/dataset/DataSetExecutorImpl.java#L319-L328https://github.com/database-rider/database-rider/blob/1.41.0/rider-core/src/main/java/com/github/database/rider/core/dataset/DataSetExecutorImpl.java#L148-L153この機能は外部キーを使用している場合、データの登録順をテーブル間の依存関係を調べて明示的に指示しなくていいので便利です。デフォルトで有効(true)になっています。機能そのものは、DbUnitのもののようです。外部キーを使ったテーブルが多くなってくると実行速度が気になってきます。issueが作成されたこともあるようです。GitHubテーブル間の依存関係を解析する機能はメモリー上にキャッシュされるので、テスト全体で実行される回数は少なくなります。https://github.com/database-rider/database-rider/blob/1.41.0/rider-core/src/main/java/com/github/database/rider/core/api/dataset/RiderSequenceFilter.java#L153-L195なのですが、IDE上でテストメソッドを実行する時などはキャッシュがないので、都度この負担が見えるようになります。この挙動をちょっと確認しておきましょう。Bootを使うことにします。"unix"データベースにはMySQLを使用しました。172.17.0.2で動作しているものとします。Bootプロジェクトを作成します。依存関係にはjdbc、mysqlを追加しました。-作成されたプロジェクト内へ移動。database-rider-resolve-table-dependenciesMaven依存関係など。</build>生成されたソースコードは削除しておきます。Rider(rider-spring)への依存関係を追加。</dependencies>今回はテストだけ実行できればいいので、@SpringBootApplicationだけを付与したダミーのクラスを作成しておきました。{}application.propertiesはこのように設定。src/main/resources/application.propertiesspring.datasource.url=jdbc:mysql://172.17.0.2:3306/practice?characterEncoding=utf-8&connectionCollation=utf8mb4_0900_binspring.datasource.username=kazuhiraspring.datasource.password=passworddbunit.ymlも作成しました。Riderの挙動がどのように変わるのか見てみましょう。以下のようなスクリプトでDDLを生成するようにしました。""")引数で3を指定すると、こんな結果になります。action);今回は500を指定して、テーブルを作成しました。500MySQL側での結果。sec)次は、テストを作成していきます。0000100004このデータセットは、@DataSetのuseSequenceFilteringの値に関わらず同じものを使います。useSequenceFilteringをtrueにしたテストを用意。実行時間だけが見たいので、テストの中身は空です。}}繰り返しになりますが、useSequenceFilteringはデフォルトでtrueなので、明示的に指定なくても同じ状態になります。このテストクラスを実行してみます。-Dtest=DatabaseRiderUseSequenceFilteringTestすると、以下の表示が出たところで動作が止まります。com.github.database.rider.core.replacers.NullReplacer@48cf8414]しばらく待つと動き始め、自分の環境では1分近くかかってテストが終了しました。------------------------------------------------------------------------この止まっている時にスレッドダンプを取ると、こんな感じになっていることが確認できます。〜省略〜このあたりが、テーブル間の依存関係を調べている処理です。com.github.database.rider.core.dataset.DataSetExecutorImpl.performSequenceFiltering(DataSetExecutorImpl.java:324)もうひとつ、useSequenceFilteringをfalseにしたテストを用意。}}こちらはuseSequenceFilteringをfalseにしているので、tableOrderingも指定しています。テストを実行してみます。-Dtest=DatabaseRiderDisableSequenceFilteringTest同じデータベースに対するテストですが、こちらはすぐに終わります。------------------------------------------------------------------------けっこう差が歴然と出ますね。今回は単純なテーブル構造なので、わかりやすく差が出るところまでテーブルを作成(500個)しましたが、ちゃんとした開発で外部キーを使うともっと複雑、複数のテーブルに外部キーを作成したりといろいろ入り組んだりすると思います。すると、ここまでの数のテーブルに到達する前に、もっとわかりやすく速度劣化します。Riderで、useSequenceFilteringをtrueにしたまま外部キーを大量に使っているデータベースを対象にすると実行が遅くなるということを見てみました。この状態になるとテストをIDE上で実行するのがだんだん嫌になってくるので、useSequenceFilteringをfalseにしてtableOrderingを指定するのが良いと思います。一方で、tableOrderingを指定するということは依存関係にしたがった順で書いていく必要があるので、面倒なのですが...。いうわけで、その対応案も考えてみました。5はてなブログをはじめよう!Kazuhiraさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。