5151import java .sql .ResultSet ;
5252import java .sql .SQLException ;
5353import java .sql .Statement ;
54+ import java .util .ArrayList ;
55+ import java .util .List ;
5456import java .util .Properties ;
5557import java .util .UUID ;
58+ import java .util .concurrent .Callable ;
59+ import java .util .concurrent .ExecutorService ;
60+ import java .util .concurrent .Executors ;
61+ import java .util .concurrent .Future ;
5662import java .util .concurrent .ThreadLocalRandom ;
5763import java .util .concurrent .TimeUnit ;
5864import org .junit .AfterClass ;
@@ -125,21 +131,21 @@ public void setup() {
125131 }
126132
127133 @ Test
128- public void testGlobalOpenTelemetry () throws SQLException , IOException , InterruptedException {
134+ public void testGlobalOpenTelemetry () throws Exception {
129135 GlobalOpenTelemetry .resetForTest ();
130136 GlobalOpenTelemetry .set (openTelemetry );
131137 Properties info = new Properties ();
132138 info .put ("enableExtendedTracing" , "true" );
133139 try (Connection connection = createConnection (env , database , info )) {
134140 testOpenTelemetry (connection );
141+ testOpenTelemetryConcurrency (() -> createConnection (env , database , info ));
135142 } finally {
136143 GlobalOpenTelemetry .resetForTest ();
137144 }
138145 }
139146
140147 @ Test
141- public void testOpenTelemetryInProperties ()
142- throws SQLException , IOException , InterruptedException {
148+ public void testOpenTelemetryInProperties () throws Exception {
143149 // Make sure there is no Global OpenTelemetry.
144150 GlobalOpenTelemetry .resetForTest ();
145151 Properties info = new Properties ();
@@ -148,6 +154,7 @@ public void testOpenTelemetryInProperties()
148154 try (Connection connection = createConnection (env , database , info )) {
149155 testOpenTelemetry (connection );
150156 }
157+ testOpenTelemetryConcurrency (() -> createConnection (env , database , info ));
151158 }
152159
153160 private void testOpenTelemetry (Connection connection )
@@ -159,14 +166,14 @@ private void testOpenTelemetry(Connection connection)
159166
160167 // Test executeQuery(String)
161168 try (ResultSet resultSet = statement .executeQuery (sql )) {
162- assertQueryResult (resultSet , sql , uuid );
169+ assertQueryResult (resultSet , sql , uuid , true );
163170 }
164171
165172 // Test execute(String)
166173 uuid = UUID .randomUUID ();
167174 sql = "select '" + uuid + "'" ;
168175 assertTrue (statement .execute (sql ));
169- assertQueryResult (statement .getResultSet (), sql , uuid );
176+ assertQueryResult (statement .getResultSet (), sql , uuid , true );
170177
171178 // Test executeUpdate(String)
172179 uuid = UUID .randomUUID ();
@@ -189,15 +196,15 @@ private void testOpenTelemetry(Connection connection)
189196 String sql = "select '" + uuid + "'" ;
190197 try (PreparedStatement statement = connection .prepareStatement (sql )) {
191198 try (ResultSet resultSet = statement .executeQuery ()) {
192- assertQueryResult (resultSet , sql , uuid );
199+ assertQueryResult (resultSet , sql , uuid , true );
193200 }
194201 }
195202
196203 uuid = UUID .randomUUID ();
197204 sql = "select '" + uuid + "'" ;
198205 try (PreparedStatement statement = connection .prepareStatement (sql )) {
199206 assertTrue (statement .execute ());
200- assertQueryResult (statement .getResultSet (), sql , uuid );
207+ assertQueryResult (statement .getResultSet (), sql , uuid , true );
201208 }
202209
203210 uuid = UUID .randomUUID ();
@@ -217,14 +224,53 @@ private void testOpenTelemetry(Connection connection)
217224 }
218225 }
219226
220- private void assertQueryResult (ResultSet resultSet , String sql , UUID uuid )
227+ private interface ConnectionProducer {
228+ Connection createConnection () throws SQLException ;
229+ }
230+
231+ private void testOpenTelemetryConcurrency (ConnectionProducer connectionProducer )
232+ throws Exception {
233+ int numThreads = 16 ;
234+ int numIterations = 1000 ;
235+ ExecutorService executor = Executors .newFixedThreadPool (16 );
236+ List <Future <?>> futures = new ArrayList <>(numThreads );
237+ for (int n = 0 ; n < numThreads ; n ++) {
238+ futures .add (
239+ executor .submit (
240+ (Callable <Void >)
241+ () -> {
242+ try (Connection connection = connectionProducer .createConnection ();
243+ Statement statement = connection .createStatement ()) {
244+ for (int i = 0 ; i < numIterations ; i ++) {
245+ UUID uuid = UUID .randomUUID ();
246+ String sql = "select '" + uuid + "'" ;
247+
248+ try (ResultSet resultSet = statement .executeQuery (sql )) {
249+ assertQueryResult (resultSet , sql , uuid , false );
250+ }
251+ }
252+ }
253+ return null ;
254+ }));
255+ }
256+ executor .shutdown ();
257+ assertTrue (executor .awaitTermination (600L , TimeUnit .SECONDS ));
258+ for (Future <?> future : futures ) {
259+ // Just verify that we did not get an exception.
260+ future .get ();
261+ }
262+ }
263+
264+ private void assertQueryResult (ResultSet resultSet , String sql , UUID uuid , boolean assertTrace )
221265 throws SQLException , IOException , InterruptedException {
222266 assertTrue (resultSet .next ());
223267 assertEquals (uuid .toString (), resultSet .getString (1 ));
224268 assertFalse (resultSet .next ());
225269
226270 flushOpenTelemetry ();
227- assertTrace (sql );
271+ if (assertTrace ) {
272+ assertTrace (sql );
273+ }
228274 }
229275
230276 private void assertUpdateResult (long updateCount , String sql )
0 commit comments