From d59771cd162233f1b315b57fb89393cf4329b6d2 Mon Sep 17 00:00:00 2001 From: Matthew Tambara Date: Thu, 3 Mar 2016 12:06:26 -0800 Subject: [PATCH] Add test to demonstrate concurrency problem --- .../pool/ConcurrentCloseConnectionTest.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java diff --git a/src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java b/src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java new file mode 100644 index 00000000..1e43a23a --- /dev/null +++ b/src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java @@ -0,0 +1,57 @@ +package com.zaxxer.hikari.pool; + +import com.zaxxer.hikari.HikariConfig; +import org.junit.Test; + +import com.zaxxer.hikari.HikariDataSource; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * @author Matthew Tambara (matthew.tambara@liferay.com) + */ +public class ConcurrentCloseConnectionTest +{ + @Test + public void testConcurrentClose() throws Exception + { + HikariConfig config = new HikariConfig(); + config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource"); + + try (HikariDataSource ds = new HikariDataSource(config); + final Connection connection = ds.getConnection()) { + + ExecutorService executorService = Executors.newFixedThreadPool(10); + + List futures = new ArrayList<>(); + + for (int i = 0; i < 500; i++) { + final PreparedStatement preparedStatement = + connection.prepareStatement(""); + + futures.add(executorService.submit(new Callable() { + + @Override + public Void call() throws Exception { + preparedStatement.close(); + + return null; + } + + })); + } + + executorService.shutdown(); + + for (Future future : futures) { + future.get(); + } + } + } +}