diff options
Diffstat (limited to 'src/test/java/com/zaxxer/hikari/pool/PostgresTest.java')
-rw-r--r-- | src/test/java/com/zaxxer/hikari/pool/PostgresTest.java | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/test/java/com/zaxxer/hikari/pool/PostgresTest.java b/src/test/java/com/zaxxer/hikari/pool/PostgresTest.java new file mode 100644 index 0000000..693e7b3 --- /dev/null +++ b/src/test/java/com/zaxxer/hikari/pool/PostgresTest.java @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2013, 2014 Brett Wooldridge + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.zaxxer.hikari.pool; + +import static com.zaxxer.hikari.pool.TestElf.getPool; +import static com.zaxxer.hikari.pool.TestElf.newHikariConfig; +import static com.zaxxer.hikari.util.ClockSource.currentTime; +import static com.zaxxer.hikari.util.ClockSource.elapsedMillis; +import static com.zaxxer.hikari.util.UtilityElf.quietlySleep; +import static java.util.concurrent.TimeUnit.MINUTES; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.junit.Before; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.util.UtilityElf; + +/** + * This test is meant to be run manually and interactively and was + * build for issue #159. + * + * @author Brett Wooldridge + */ +public class PostgresTest +{ + //@Test + public void testCase1() throws Exception + { + HikariConfig config = newHikariConfig(); + config.setMinimumIdle(3); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(3000); + config.setIdleTimeout(TimeUnit.SECONDS.toMillis(10)); + config.setValidationTimeout(TimeUnit.SECONDS.toMillis(2)); + + config.setJdbcUrl("jdbc:pgsql://localhost:5432/test"); + config.setUsername("brettw"); + + try (final HikariDataSource ds = new HikariDataSource(config)) { + final long start = currentTime(); + do { + Thread t = new Thread() { + public void run() { + try (Connection connection = ds.getConnection()) { + System.err.println("Obtained connection " + connection); + quietlySleep(TimeUnit.SECONDS.toMillis((long)(10 + (Math.random() * 20)))); + } + catch (SQLException e) { + e.printStackTrace(); + } + } + }; + t.setDaemon(true); + t.start(); + + quietlySleep(TimeUnit.SECONDS.toMillis((long)((Math.random() * 20)))); + } while (elapsedMillis(start) < MINUTES.toMillis(15)); + } + } + + //@Test + public void testCase2() throws Exception + { + HikariConfig config = newHikariConfig(); + config.setMinimumIdle(3); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(1000); + config.setIdleTimeout(TimeUnit.SECONDS.toMillis(60)); + + config.setJdbcUrl("jdbc:pgsql://localhost:5432/test"); + config.setUsername("brettw"); + + try (HikariDataSource ds = new HikariDataSource(config)) { + + try (Connection conn = ds.getConnection()) { + System.err.println("\nGot a connection, and released it. Now, enable the firewall."); + } + + getPool(ds).logPoolState(); + quietlySleep(5000L); + + System.err.println("\nNow attempting another getConnection(), expecting a timeout..."); + + long start = currentTime(); + try (Connection conn = ds.getConnection()) { + System.err.println("\nOpps, got a connection. Did you enable the firewall? " + conn); + fail("Opps, got a connection. Did you enable the firewall?"); + } + catch (SQLException e) + { + assertTrue("Timeout less than expected " + elapsedMillis(start) + "ms", elapsedMillis(start) > 5000); + } + + System.err.println("\nOk, so far so good. Now, disable the firewall again. Attempting connection in 5 seconds..."); + quietlySleep(5000L); + getPool(ds).logPoolState(); + + try (Connection conn = ds.getConnection()) { + System.err.println("\nGot a connection, and released it."); + } + } + + System.err.println("\nPassed."); + } + + //@Test + public void testCase3() throws Exception + { + HikariConfig config = newHikariConfig(); + config.setMinimumIdle(3); + config.setMaximumPoolSize(10); + config.setConnectionTimeout(1000); + config.setIdleTimeout(TimeUnit.SECONDS.toMillis(60)); + + config.setJdbcUrl("jdbc:pgsql://localhost:5432/test"); + config.setUsername("brettw"); + + try (final HikariDataSource ds = new HikariDataSource(config)) { + for (int i = 0; i < 10; i++) { + new Thread() { + public void run() { + try (Connection conn = ds.getConnection()) { + System.err.println("ERROR: should not have acquired connection."); + } + catch (SQLException e) { + // expected + } + } + }.start(); + } + + quietlySleep(5000L); + + System.err.println("Now, bring the DB online. Checking pool in 15 seconds."); + quietlySleep(15000L); + + getPool(ds).logPoolState(); + } + } + + // @Test + public void testCase4() throws Exception + { + HikariConfig config = newHikariConfig(); + config.setMinimumIdle(0); + config.setMaximumPoolSize(15); + config.setConnectionTimeout(10000); + config.setIdleTimeout(TimeUnit.MINUTES.toMillis(1)); + config.setMaxLifetime(TimeUnit.MINUTES.toMillis(2)); + config.setRegisterMbeans(true); + + config.setJdbcUrl("jdbc:postgresql://localhost:5432/netld"); + config.setUsername("brettw"); + + try (final HikariDataSource ds = new HikariDataSource(config)) { + + countdown(20); + List<Thread> threads = new ArrayList<>(); + for (int i = 0; i < 20; i++) { + threads.add(new Thread() { + public void run() { + UtilityElf.quietlySleep((long)(Math.random() * 2500L)); + final long start = currentTime(); + do { + try (Connection conn = ds.getConnection(); Statement stmt = conn.createStatement()) { + try (ResultSet rs = stmt.executeQuery("SELECT * FROM device WHERE device_id=0 ORDER BY device_id LIMIT 1 OFFSET 0")) { + rs.next(); + } + UtilityElf.quietlySleep(100L); //Math.max(50L, (long)(Math.random() * 250L))); + } + catch (SQLException e) { + e.printStackTrace(); + // throw new RuntimeException(e); + } + + // UtilityElf.quietlySleep(10L); //Math.max(50L, (long)(Math.random() * 250L))); + } while (elapsedMillis(start) < TimeUnit.MINUTES.toMillis(5)); + } + }); + } + +// threads.forEach(t -> t.start()); +// threads.forEach(t -> { try { t.join(); } catch (InterruptedException e) {} }); + } + } + + @Before + public void before() + { + System.err.println("\n"); + } + + private void countdown(int seconds) + { + do { + System.out.printf("Starting in %d seconds...\n", seconds); + if (seconds > 10) { + UtilityElf.quietlySleep(TimeUnit.SECONDS.toMillis(10)); + seconds -= 10; + } + else { + UtilityElf.quietlySleep(TimeUnit.SECONDS.toMillis(1)); + seconds -= 1; + } + } while (seconds > 0); + } +} |