iku8blog

Webエンジニアのタダのメモ。

Spring Data JPAの@Queryでクエリを意図的に遅くする方法

f:id:iku8:20210529154707p:plain

Spring Data JPAを使用している際にクエリを意図的に遅くしたくなったので、その時のメモ(mysql)

public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "select * from user where user_id != (select sleep(0.5));", nativeQuery = true)
    List<User> slowFindAll();
}

これで1秒後にクエリ結果が帰る。sleepの返却値は0なので、0以外のuser_idを持つレコードを取得してきている。

select * from user where user_id != (select sleep(0.5));

sqlクライアントで上記実行すると同じ結果が得られる。

select sleep(0.5)

は0.5秒間クエリを停止状態にするものだが、なぜかサブクエリにすると倍の時間がかかってしまった。1秒で計測したかったので、0.5とした。わかる方いたら教えてほしい。

以上で求めていることは実現出来るが、当初

@Query("select sleep(1);select * from user;")

このようにしており、この状態だとjpaではsyntax errorとなっていたので、わざわざサブクエリにした。 ちなみにjpaではなくr2dbcのReactiveCrudRepositoryを継承したインタフェースで同様のことを行う場合は、サブクエリ発行せずとも上記の方法で実現可能。