Skip to content

Commit fbe42c0

Browse files
marijarinm.zharinova
andauthored
Set query timeout (#169)
* add jdbc template timeout to spring 2 module * add jdbc template query timeout to spring boot 3 module * delete empty lines --------- Co-authored-by: m.zharinova <[email protected]>
1 parent cf92ec4 commit fbe42c0

File tree

8 files changed

+84
-14
lines changed

8 files changed

+84
-14
lines changed

spring-boot-2-demo-app/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ spring:
6363
enable-logging: true
6464
log-level: INFO
6565
includes: QUERY
66+
template:
67+
query-timeout: 1 # 1 second
6668

6769
management:
6870
server:
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,37 @@
11
package io.github.mfvanek.spring.boot2.test;
22

33
import io.github.mfvanek.spring.boot2.test.support.TestBase;
4+
import org.junit.jupiter.api.DisplayName;
45
import org.junit.jupiter.api.Test;
6+
import org.springframework.dao.DataAccessResourceFailureException;
7+
8+
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.assertj.core.api.Assertions.assertThatNoException;
10+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
511

612
class ApplicationTests extends TestBase {
713

814
@Test
915
void contextLoads() {
1016
}
17+
18+
@Test
19+
void jdbcQueryTimeoutFromProperties() {
20+
assertThat(jdbcTemplate.getQueryTimeout())
21+
.isEqualTo(1);
22+
}
23+
24+
@Test
25+
@DisplayName("Throws exception when query exceeds timeout")
26+
void exceptionWithLongQuery() {
27+
assertThatThrownBy(() -> jdbcTemplate.execute("select pg_sleep(1.1);"))
28+
.isInstanceOf(DataAccessResourceFailureException.class)
29+
.hasMessageContaining("ERROR: canceling statement due to user request");
30+
}
31+
32+
@Test
33+
@DisplayName("Does not throw exception when query does not exceed timeout")
34+
void exceptionNotThrownWithNotLongQuery() {
35+
assertThatNoException().isThrownBy(() -> jdbcTemplate.execute("select pg_sleep(0.9);"));
36+
}
1137
}

spring-boot-2-demo-app/src/test/java/io/github/mfvanek/spring/boot2/test/support/TestBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.boot.test.context.SpringBootTest;
5+
import org.springframework.jdbc.core.JdbcTemplate;
56
import org.springframework.test.context.ActiveProfiles;
67
import org.springframework.test.context.ContextConfiguration;
78
import org.springframework.test.web.reactive.server.WebTestClient;
@@ -13,4 +14,7 @@ public abstract class TestBase {
1314

1415
@Autowired
1516
protected WebTestClient webTestClient;
17+
18+
@Autowired
19+
protected JdbcTemplate jdbcTemplate;
1620
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
spring:
2+
jdbc:
3+
template:
4+
query-timeout: 1 # 1 second

spring-boot-3-demo-app/src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ jdbc:
118118
enable-logging: true
119119
log-level: INFO
120120
includes: QUERY
121+
template:
122+
query-timeout: 1 # 1 second
121123

122124
---
123125

spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/ApplicationTests.java

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
import io.micrometer.tracing.Tracer;
88
import io.micrometer.tracing.otel.bridge.OtelTracer;
99
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
10+
import org.junit.jupiter.api.DisplayName;
1011
import org.junit.jupiter.api.Test;
1112
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.springframework.context.ApplicationContext;
14+
import org.springframework.dao.DataAccessResourceFailureException;
1315

1416
import java.util.Locale;
1517

1618
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.assertThatNoException;
20+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1721

1822
class ApplicationTests extends TestBase {
1923

@@ -23,22 +27,42 @@ class ApplicationTests extends TestBase {
2327
@Test
2428
void contextLoads() {
2529
assertThat(applicationContext.containsBean("otlpMeterRegistry"))
26-
.isFalse();
30+
.isFalse();
2731
assertThat(applicationContext.getBean(ObservationRegistry.class))
28-
.isNotNull()
29-
.isInstanceOf(ObservationRegistry.class);
32+
.isNotNull()
33+
.isInstanceOf(ObservationRegistry.class);
3034
assertThat(applicationContext.getBean(Tracer.class))
31-
.isNotNull()
32-
.isInstanceOf(OtelTracer.class)
33-
.satisfies(t -> assertThat(t.currentSpan())
34-
.isNotEqualTo(Span.NOOP));
35+
.isNotNull()
36+
.isInstanceOf(OtelTracer.class)
37+
.satisfies(t -> assertThat(t.currentSpan())
38+
.isNotEqualTo(Span.NOOP));
3539
assertThat(applicationContext.getBean("otelJaegerGrpcSpanExporter"))
36-
.isNotNull()
37-
.isInstanceOf(OtlpGrpcSpanExporter.class)
38-
.hasToString(String.format(Locale.ROOT, "OtlpGrpcSpanExporter{exporterName=otlp, type=span, " +
39-
"endpoint=http://localhost:%d, " +
40-
"endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, timeoutNanos=5000000000, " +
41-
"connectTimeoutNanos=10000000000, compressorEncoding=null, " +
42-
"headers=Headers{User-Agent=OBFUSCATED}}", JaegerInitializer.getFirstMappedPort()));
40+
.isNotNull()
41+
.isInstanceOf(OtlpGrpcSpanExporter.class)
42+
.hasToString(String.format(Locale.ROOT, "OtlpGrpcSpanExporter{exporterName=otlp, type=span, " +
43+
"endpoint=http://localhost:%d, " +
44+
"endpointPath=/opentelemetry.proto.collector.trace.v1.TraceService/Export, timeoutNanos=5000000000, " +
45+
"connectTimeoutNanos=10000000000, compressorEncoding=null, " +
46+
"headers=Headers{User-Agent=OBFUSCATED}}", JaegerInitializer.getFirstMappedPort()));
47+
}
48+
49+
@Test
50+
void jdbcQueryTimeoutFromProperties() {
51+
assertThat(jdbcTemplate.getQueryTimeout())
52+
.isEqualTo(1);
53+
}
54+
55+
@Test
56+
@DisplayName("Throws exception when query exceeds timeout")
57+
void exceptionWithLongQuery() {
58+
assertThatThrownBy(() -> jdbcTemplate.execute("select pg_sleep(1.1);"))
59+
.isInstanceOf(DataAccessResourceFailureException.class)
60+
.hasMessageContaining("ERROR: canceling statement due to user request");
61+
}
62+
63+
@Test
64+
@DisplayName("Does not throw exception when query does not exceed timeout")
65+
void exceptionNotThrownWithNotLongQuery() {
66+
assertThatNoException().isThrownBy(() -> jdbcTemplate.execute("select pg_sleep(0.9);"));
4367
}
4468
}

spring-boot-3-demo-app/src/test/java/io/github/mfvanek/spring/boot3/test/support/TestBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.beans.factory.annotation.Autowired;
44
import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability;
55
import org.springframework.boot.test.context.SpringBootTest;
6+
import org.springframework.jdbc.core.JdbcTemplate;
67
import org.springframework.test.context.ActiveProfiles;
78
import org.springframework.test.context.ContextConfiguration;
89
import org.springframework.test.web.reactive.server.WebTestClient;
@@ -15,4 +16,7 @@ public abstract class TestBase {
1516

1617
@Autowired
1718
protected WebTestClient webTestClient;
19+
20+
@Autowired
21+
protected JdbcTemplate jdbcTemplate;
1822
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
spring:
2+
jdbc:
3+
template:
4+
query-timeout: 1 # 1 second

0 commit comments

Comments
 (0)