pg_sleep()
PostgreSQL 에서는 pg_sleep()
을 사용하여 지정된 시간(초) 동안 실행을 지연시킬 수 있음
- 지정된 시간(초) 가 경과할 때까지 해당 세션의 프로세스를 절전 모드로 만듦
- MySQL 에서의
sleep()
과 유사하게 작동 - 소수점 초 단위 지연을 지정할 수도 있음
문법
select pg_sleep(seconds)
seconds
에는 프로세스가 진행되기 전 반드시 경과해야 하는 시간(초)를 지정할 수 있다- 소수점 단위로도 가능하며
double precision
값이다
예시
SELECT
clock_timestamp(),
pg_sleep(1),
clock_timestamp(),
pg_sleep(1),
clock_timestamp();
clock_timestamp() 의 실행 사이 사이에 약 1초정도의 지연이 존재하는 것을 볼 수 있다
SELECT pg_sleep_for('1 seconds');
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00')
찾아보면 이런 것도 가능하다!
응용
public void callPgSleep(Double interval) {
Query query = entityManager.createNativeQuery("SELECT pg_sleep(?)")
.setParameter(1, interval);
query.getResultList();
}
@GET
public Response callSleep(@QueryParam("interval") @DefaultValue("10") Double interval) {
sleepService.callPgSleep(interval);
return Response.noContent().build();
}
해당 쿼리를 실행하기 위해서 Native Query를 생성하고, 이를 실행해 주었다
인자로 interval 을 Double 형태로 받고, 해당 경로로 오는 요청에 대하여 pg_sleep 을 호출하는 코드를 작성해 보았다
요청
GET http://localhost:7020/api/sleep?interval=5
응답
HTTP/1.1 204 No Content
<Response body is empty>Response code: 204 (No Content); Time: 5013ms (5 s 13 ms); Content length: 0 bytes (0 B)
정확히 5초는 아니지만, 살짝 지연된 시간 이후 응답을 받을 수 있었다
실제 postgresql 의 공식 docs 에서도 서버 부하 요인에 따라 더 길어질 수 있다 라고 언급되어 있고,
"지정한 시간에 정확히 깨어난다는 보장은 없지만, 더 일찍 깨어나지는 않는다" 라고 나와 있다
Reference
https://www.postgresql.org/docs/16/functions-datetime.html#FUNCTIONS-DATETIME-DELAY
https://database.guide/how-pg_sleep-works-in-postgresql/
댓글