Full Code of brettwooldridge/HikariCP for AI

dev bba167f0a289 cached
139 files
819.2 KB
186.0k tokens
1539 symbols
1 requests
Download .txt
Showing preview only (870K chars total). Download the full file or copy to clipboard to get everything.
Repository: brettwooldridge/HikariCP
Branch: dev
Commit: bba167f0a289
Files: 139
Total size: 819.2 KB

Directory structure:
gitextract_ly1ilzq_/

├── .circleci/
│   └── config.yml
├── .editorconfig
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .settings/
│   ├── org.eclipse.core.resources.prefs
│   ├── org.eclipse.jdt.apt.core.prefs
│   ├── org.eclipse.jdt.core.prefs
│   ├── org.eclipse.m2e.core.prefs
│   └── org.eclipse.pde.core.prefs
├── CHANGES
├── KEYS.txt
├── LICENSE
├── README.md
├── codecov.yml
├── documents/
│   ├── Wall-of-Fame.md
│   └── Welcome-To-The-Jungle.md
├── install-jdk.sh
├── osx-toolchains.xml
├── pom.xml
└── src/
    ├── main/
    │   └── java/
    │       ├── com/
    │       │   └── zaxxer/
    │       │       └── hikari/
    │       │           ├── HikariConfig.java
    │       │           ├── HikariConfigMXBean.java
    │       │           ├── HikariCredentialsProvider.java
    │       │           ├── HikariDataSource.java
    │       │           ├── HikariJNDIFactory.java
    │       │           ├── HikariPoolMXBean.java
    │       │           ├── SQLExceptionOverride.java
    │       │           ├── hibernate/
    │       │           │   ├── HikariConfigurationUtil.java
    │       │           │   └── HikariConnectionProvider.java
    │       │           ├── metrics/
    │       │           │   ├── IMetricsTracker.java
    │       │           │   ├── MetricsTracker.java
    │       │           │   ├── MetricsTrackerFactory.java
    │       │           │   ├── PoolStats.java
    │       │           │   ├── dropwizard/
    │       │           │   │   ├── CodaHaleMetricsTracker.java
    │       │           │   │   ├── CodahaleHealthChecker.java
    │       │           │   │   ├── CodahaleMetricsTrackerFactory.java
    │       │           │   │   ├── Dropwizard5MetricsTracker.java
    │       │           │   │   ├── Dropwizard5MetricsTrackerFactory.java
    │       │           │   │   └── DropwizardCommon.java
    │       │           │   ├── micrometer/
    │       │           │   │   ├── MicrometerMetricsTracker.java
    │       │           │   │   └── MicrometerMetricsTrackerFactory.java
    │       │           │   └── prometheus/
    │       │           │       ├── HikariCPCollector.java
    │       │           │       ├── PrometheusHistogramMetricsTracker.java
    │       │           │       ├── PrometheusHistogramMetricsTrackerFactory.java
    │       │           │       ├── PrometheusMetricsTracker.java
    │       │           │       └── PrometheusMetricsTrackerFactory.java
    │       │           ├── pool/
    │       │           │   ├── HikariPool.java
    │       │           │   ├── PoolBase.java
    │       │           │   ├── PoolEntry.java
    │       │           │   ├── ProxyCallableStatement.java
    │       │           │   ├── ProxyConnection.java
    │       │           │   ├── ProxyDatabaseMetaData.java
    │       │           │   ├── ProxyFactory.java
    │       │           │   ├── ProxyLeakTask.java
    │       │           │   ├── ProxyLeakTaskFactory.java
    │       │           │   ├── ProxyPreparedStatement.java
    │       │           │   ├── ProxyResultSet.java
    │       │           │   └── ProxyStatement.java
    │       │           └── util/
    │       │               ├── ClockSource.java
    │       │               ├── ConcurrentBag.java
    │       │               ├── Credentials.java
    │       │               ├── DriverDataSource.java
    │       │               ├── FastList.java
    │       │               ├── IsolationLevel.java
    │       │               ├── JavassistProxyFactory.java
    │       │               ├── PropertyElf.java
    │       │               ├── SuspendResumeLock.java
    │       │               └── UtilityElf.java
    │       └── module-info.java
    └── test/
        ├── java/
        │   └── com/
        │       └── zaxxer/
        │           └── hikari/
        │               ├── HikariConfigTest.java
        │               ├── datasource/
        │               │   └── TestSealedConfig.java
        │               ├── db/
        │               │   └── BasicPoolTest.java
        │               ├── metrics/
        │               │   ├── dropwizard/
        │               │   │   ├── CodaHaleMetricsTrackerTest.java
        │               │   │   └── Dropwizard5MetricsTrackerTest.java
        │               │   ├── micrometer/
        │               │   │   └── MicrometerMetricsTrackerTest.java
        │               │   └── prometheus/
        │               │       ├── HikariCPCollectorTest.java
        │               │       ├── PrometheusHistogramMetricsTrackerFactoryTest.java
        │               │       ├── PrometheusHistogramMetricsTrackerTest.java
        │               │       ├── PrometheusMetricsTrackerFactoryTest.java
        │               │       └── PrometheusMetricsTrackerTest.java
        │               ├── mocks/
        │               │   ├── MockDataSource.java
        │               │   ├── StubBaseConnection.java
        │               │   ├── StubConnection.java
        │               │   ├── StubDataSource.java
        │               │   ├── StubDriver.java
        │               │   ├── StubPoolStats.java
        │               │   ├── StubPreparedStatement.java
        │               │   ├── StubResultSet.java
        │               │   ├── StubStatement.java
        │               │   └── TestObject.java
        │               ├── osgi/
        │               │   └── OSGiBundleTest.java
        │               ├── pool/
        │               │   ├── CodahaleMetricsTest.java
        │               │   ├── ConcurrentCloseConnectionTest.java
        │               │   ├── ConnectionPoolSizeVsThreadsTest.java
        │               │   ├── ConnectionRaceConditionTest.java
        │               │   ├── ConnectionStateTest.java
        │               │   ├── Dropwizard5MetricsTest.java
        │               │   ├── ExceptionTest.java
        │               │   ├── HouseKeeperCleanupTest.java
        │               │   ├── IsolationTest.java
        │               │   ├── JdbcDriverTest.java
        │               │   ├── MetricsTrackerTest.java
        │               │   ├── MiscTest.java
        │               │   ├── PostgresTest.java
        │               │   ├── RampUpDown.java
        │               │   ├── RequestBoundariesTest.java
        │               │   ├── ShutdownTest.java
        │               │   ├── StatementTest.java
        │               │   ├── TestConcurrentBag.java
        │               │   ├── TestConnectionCloseBlocking.java
        │               │   ├── TestConnectionTimeoutRetry.java
        │               │   ├── TestConnections.java
        │               │   ├── TestCredentials.java
        │               │   ├── TestElf.java
        │               │   ├── TestHibernate.java
        │               │   ├── TestIsRunning.java
        │               │   ├── TestJNDI.java
        │               │   ├── TestJavassistCodegen.java
        │               │   ├── TestMBean.java
        │               │   ├── TestMetrics.java
        │               │   ├── TestMetricsBase.java
        │               │   ├── TestPropertySetter.java
        │               │   ├── TestProxies.java
        │               │   ├── TestSaturatedPool830.java
        │               │   ├── TestStates.java
        │               │   ├── TestValidation.java
        │               │   └── UnwrapTest.java
        │               └── util/
        │                   ├── ClockSourceTest.java
        │                   ├── DriverDataSourceTest.java
        │                   ├── PropertyElfTest.java
        │                   ├── TestFastList.java
        │                   ├── TomcatConcurrentBagLeakTest.java
        │                   └── UtilityElfTest.java
        └── resources/
            ├── duration-config.properties
            ├── hibernate.properties
            ├── log4j2-test.xml
            ├── postgres_init_script.sql
            ├── propfile1.properties
            ├── propfile2.properties
            └── propfile3.properties

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
jobs:
  build: # name of your job
    machine: true # executor type
    resource_class: brettwooldridge/ubuntu

    steps:
      # Commands run in a Linux virtual machine environment
      - checkout
      - run: mvn clean package



================================================
FILE: .editorconfig
================================================
# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

[**]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_style = space
trim_trailing_whitespace = true

[**.{java,xml}]
indent_size = 3

[**.{yaml,yml}]
indent_size = 2


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
jobs:
  build:
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        java: ['11']
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK
      uses: actions/setup-java@v1
      with:
        java-version: ${{ matrix.java }}
    - name: print Java version
      run: java -version
    - uses: actions/cache@v2
      with:
        path: ~/.m2/repository
        key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
        restore-keys: |
          ${{ runner.os }}-maven-
    - name: Build
      run: mvn --no-transfer-progress -B clean package --file pom.xml


================================================
FILE: .gitignore
================================================
.classpath
.project
.metadata

target/
dependency-reduced-pom.xml

.DS_Store

**/*.iml

*.class
*.jar
*.war
*.ear
*.iml
*.iws
*.ipr

.tm_*
.idea/
.gradle/
out/


================================================
FILE: .settings/org.eclipse.core.resources.prefs
================================================
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding//target/classes=UTF-8
encoding/<project>=UTF-8


================================================
FILE: .settings/org.eclipse.jdt.apt.core.prefs
================================================
eclipse.preferences.version=1
org.eclipse.jdt.apt.aptEnabled=false


================================================
FILE: .settings/org.eclipse.jdt.core.prefs
================================================
eclipse.preferences.version=1
org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
org.eclipse.jdt.core.compiler.processAnnotations=disabled
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=11


================================================
FILE: .settings/org.eclipse.m2e.core.prefs
================================================
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1


================================================
FILE: .settings/org.eclipse.pde.core.prefs
================================================
BUNDLE_ROOT_PATH=target/classes
eclipse.preferences.version=1


================================================
FILE: CHANGES
================================================
HikariCP Changes

Changes in 7.0.2

 * decrease thread yield frequency in ConcurrentBag.unreserve()

Changes in 7.0.1

 * merged #2346 fix regression with setSchema behavior

 * decrease thread yield frequency in ConcurrentBag.requite()

Changes in 7.0.0

 * merged #2340 NoSuchMethodException error that is thrown when setting a metric registry, fixes to UtilityElf
   reflection code to use the correct method signature.

 * fixed #1294 add support for HikariCredentialsProvider class

 * fixed #2265 bail out of the pool filling loop if the thread is interrupted

Changes in 6.3.3

 * backport #2340 NoSuchMethodException error that is thrown when setting a metric registry, fixes to UtilityElf
   reflection code to use the correct method signature.

Changes in 6.3.2

 * fixed #2342 restore module-info.class to jar file, which was lost in 6.3.1

 * fixed #2256 add support for legacy override of getUsername()/getPassword() of HikariDataSource. See project page
   for documentation of system property com.zaxxer.hikari.legacy.supportUserPassDataSourceOverride.

 * fixed #2323 right or wrong (wrt driver behavior) return to previous Connection.get/setSchema behavior

 * fixed #2288 upgrade dependencies and fix build warnings

Changes in 6.3.1

 * fixed #2315 source jar contains also binary .class files and missing some .java files

 * fixed #2307 remove improper hardcoded timout, use validationTimeout

 * fixed #2305 keep properties key and values as is rather than forcing stringification. Also fixes #2286 and #2304

 * upgraded various maven plugin dependencies to latest versions

Changes in 6.3.0

 * increase keepaliveTime variance from 10% to 20%

 * merged #2266 support duration values for configuration from properties, such as 10ms, 20s, 30m, 40h or 50d

 * merged #2284 align logs from HikariPool.logPoolState()

 * merged #2285 set default value for maxIdle in HikariConfig constructor (no functional change)

 * merged #2294 Allow setting String[] and int[] properties (useful for pgjdbc HA configuration)

 * merged #2300 catch java.lang.Error instead of java.lang.Exception under certain conditions

Changes in 6.2.1

 * change default keepaliveTime to 2 minutes

 * fix commons-compress dependency, make test scope

Changes in 6.2.0

 * merged #2238 handle SQLTimeoutException without eviction. Users looking to preserve previous behavior
   should provide an implementation of com.zaxxer.hikari.SQLExceptionOverride to the pool configuration.

 * added new enum value, Override.MUST_EVICT, available to implementations of com.zaxxer.hikari.SQLExceptionOverride

 * enhanced debug logging in circumstances where the pool falls to zero size and new connections to the database
   continue to fail.

 * update test dependencies that were flagged as having vulnerabilities

Changes in 6.1.0

 * fixed #1960 allow SQLExceptionOverride to adjudicate all exceptions for eviction

 * merged #1962 dropwizard 5 metrics are now supported via the setMetricRegistry() method in HikariConfig and in HikariDataSource

 * merged #2244 improve JavassistProxyFactory

 * merged #2243 fix inconsistency between isWrapperFor and unwrap

 * merged #1827 support loading properties file in unnamed resources module

 * merged #1842 don't clear isCommitStateDirty flag in setReadOnly

 * change default maxLifetime variance from 2.5% to 25% to further avoid mass connection die-off dips

Changes in 6.0.0

 * fixed #2152 duplicate connection in try with resources clause caused close() being called twice on each connection

 * merged #2226 consistent handling of errorCode and sqlState in timeout exception

 * merged #2199 eliminate network call if state get is called after set

 * merged #2189 add support to get and set db credentials in an atomic operation

 * merged #2149 make Savepoint rollbacks mark the connection dirty

 * merged #2157 close connections marked as evicted instead of returning them to the pool

 * merged #2147 skip Connection::setNetworkTimeout if PoolBase::shutdownNetworkTimeoutExecutor is called

 * merged #2126 added Support For beginRequest and endRequest

 * small improvements and cleanup from pull request #2166

 * minor debug logging enhancements

Changes in 5.1.0

 * fixed #1907 re-added automatic.module.name that was lost along the way

 * fixed #1986 evict connection exceptions with (SQLState HY000) error code 1105.

 * merged #2059 add support for char[] in DataSource properties

 * merged #1979 and #1993 mask any property that looks like a password in URLs

 * add pool stats to connection acquisition timeout exception

 * merged #2076 don't case metric registry before it is checked for null

 * merged #1820 allow minimum login timeout to be set as system property

 * merged #1952 add more isolation levels

 * merged #1660 remove redundant error log for poll initialization exception

Changes in 5.0.1

 * Update log4j version to 2.17.1 to address Log4Shell vulnerability (although this is only used in tests, so it doesn't really impact users)

Changes in 5.0.0

 * rewrote connection elide/add code to fix an unconfirmed but occasionally reported
   race condition that results in the pool draining to 0 and not refilling.

Changes in 4.0.3

 * fixed #1735 added system property to permit override of lower limit of connectionTimeout
   and validation timeout

Changes in 4.0.2

 * fixed regression caused by #1605 affecting block-until-filled semantic

Changes in 4.0.1

 * fixed #1725 pom file change to be more gradle-friendly

 * fixed #1726 regression in micrometrics caused by lack of a strong reference to an
   object

Changes in 4.0.0

 * merged #1669 #1582 mark optional dependencies as 'require static' in module-info

 * merged #1700 remove micrometer metrics upon close

 * merged #1661 mark generated proxy classes final

 * merged #1681 allow alternate, more standard, JMX ObjectName, enabled by setting system
   property 'hikaricp.jmx.register2.0=true'

 * merged #1605 fixes Java 11 issue where setMaximumPoolSize needs to be called before
   setCorePoolSize in ThreadPoolExecutor

 * merged #1581 handle setting java 'short' property values from property files

 * merged #1699 add new configuration property 'keepaliveTime'

 * merged #1692 fix prometheus histogram metric tracker for multiple pools

Changes in 3.4.5

 * fixed 1578 build change to ensure that proxies are generated using Java 8, otherwise we end
   up with class references to Java 11 classes, which fail to load on Java 8.

Changes in 3.4.4

 * Build HikariCP as a JEP 238 Multi-Release jar for increased compatability with Java 11 and
   future modularized Java versions.

Changes in 3.4.3

 * fixed 1534 check resultSet.getStatement() for null in ProxyDatabaseMetaData.

 * add additional debug logging around connection add.

 * add ThreadLocal removal attempt when bag item is removed.

Changes in 3.4.2

 * fixed 1528 regression caused by pull request 1159 whereby fail-fast logic would exit upon all
   errors even if it was configured to continue trying.

Changes in 3.4.1

 * fix regression caused by 1337, which broke the ability to pass the isolation level by integer
   value (string) instead of isolation level name.

Changes in 3.4.0

 * merged 1265 alternative Prometheus metrics Histogram instead of locking Summary (which is
   purportedly quite lock-heavy.

 * merged 1337 support accepting TRANSACTION_SQL_SERVER_SNAPSHOT_ISOLATION_LEVEL string for
   isolation level.

 * merged 1331 user contribution: major refactor of metrics handling, hopefully without any
   breakage.

 * add proxy class for DatabaseMetaData to intercept DatabaseMetaData.getConnection() call which was
   leaking the raw database Connection object.

Changes in 3.3.1

 * fixed 1287 set core pool size before max pool size

 * fixed 1308 treat a SQLTimeoutException as an evictable offense

 * do not default maxPoolSize to minIdle when only minIdle is specified

 * do not log warning about idleTimeout unless minimumIdle is less than maxPoolSize (because otherwise
   it does not apply)

Changes in 3.3.0

 * Revert change where Connection.isClosed() was called outside of setNetworkTimeout() block, opening
   vulnerability to unacknowledged TCP traffic.

 * fixed 1186 limit number of items in the ConcurrentBag's ThreadLocal list to avoid OOM errors in some
   borrow/requite patterns.

 * Merged changed to log uncaught (Throwable) exceptions during connection acquisition.

 * fixed 1161 fix logging formatting anchor.

 * fixed 1181, 1182 allow passing a Prometheus CollectorRegistry rather than always using the default
   registry.

 * merged 1210 use orElseGet() to delay call until necessary with respect to the housekeeper thread
   factory.

 * fixed 1074 capability to instantiate an object based on the String class name, usefull when you want
   to set the MetricsTackerFactory from a property.

 * merged 1250 fix proxy classes generation reproducibility using a sorted LinkedHashSet

 * various clean-ups pointed out by sonarcloud.io

 * merged 1290 Class.newInstance() is deprecated as of Java 9. Usage should be replaced by calling
   Class.getDeclaredConstructor().newInstance().

 * fixed #1305 ensure that ConcurrentBag.add() does not spin under high load, when waiting threads may never
   reach 0.

 * fixes #1287 when system property blockUntilFilled is set, use multiple threads to fill the pool.

Changes in 3.2.0

 * check connection closed condition before attempting to set network timeout to avoid spurios exceptions
   in the log.

 * updated validation failure message to include recommendation to check maxLifetime value.

 * fixed 1141 do not throw SQLException when calling isClosed() or close() on a already closed unwrapped
   Connection, as per JDBC specification.

 * fixed 1137 support changing user/password at runtime for DriverDataSource-wrapped driver connections.

 * fixed 1136 log loaded driver when using jdbcUrl.

 * pull 1135 extract sealed pool check into independent method.

 * fixed 1126 correct error in JavaDoc for HikariConfig.setInitializationFailTimeout().

 * fixed 1114 removed unreachable code.

Changes in 3.1.0

 * Add get/setCatalog() to HikariConfigMXBean, allowing the catalog to be changed at runtime.
   The catalog should only be changed while the pool is suspended, and after evicting existing
   connections via HikariPoolMXBean.softEvictConnections().

Changes in 3.0.0

 * Removed previously deprecated methods;
     HikariConfig.copyState()
     HikariConfig.getScheduledExecutorService()
     HikariConfig.setScheduledExecutorService()
     HikariConfig.isInitializationFailFast()
     HikariConfig.setInitializationFailFast()
     HikariConfig.isJdbc4ConnectionTest()
     HikariConfig.setJdbc4ConnectionTest()

     HikariDataSource.copyState()
     HikariDataSource.getScheduledExecutorService()
     HikariDataSource.setScheduledExecutorService()
     HikariDataSource.suspendPool()
     HikariDataSource.resumePool()
     HikariDataSource.shutdown()
     HikariDataSource.isInitializationFailFast()
     HikariDataSource.setInitializationFailFast()
     HikariDataSource.isJdbc4ConnectionTest()
     HikariDataSource.setJdbc4ConnectionTest()

 * pull 1110 add currently configured maxConnections and minConnections to pool metrics.

 * pull 1100 remove hard-coded percentiles for Micrometer metrics.

 * pull 1108 maintain a strong reference to PoolStats for Micrometer gauges to prevent premature
   garbage collection.

 * pull 1098 update to Micrometer 1.0.0.

Changes in 2.7.8

 * fixed 1095 fix breakage caused by sealed configuration with respect to special handling for the
   metricsRegistry and metricsTrackerFactory properties, which are allowed to be altered *once*
   after the pool has started (even after the configuration is sealed).

 * pull 1089 allowing anonymous subclasses of MetricRegistry. Changed checks for metrics libraries
   from a class name check to the assignableFrom() API.

Changes in 2.7.7

 * fixed issue whereby configuration through the HikariConfigMXBean could not be altered due
   to the sealed configuration change introduced in 2.7.5.

Changes in 2.7.6

 * issue 1064 fixed regression where HikariConfig.copyStateTo() propagated the "sealed" status
   of the source configuration to the target configuration -- preventing further changes.

Changes in 2.7.5

 * issue 1061/pull 1062 fixed compatibility issue with requery.io caused by HikariCP's
   proxied Statement class returning a driver-native ResultSet instance from getGeneratedKeys()
   instead of returning a HikariCP proxied ResultSet.

 * pull 1058 enable quantiles on Prometheus metrics.

 * pull 1055 fixed incorrect JavaDoc for HikariConfigMXBean.getMinimumIdle() method.

 * issue 1045/pull 1047 added Automatic-Module-Name to jar manifest to ensure that the Java 8
   library plays well with the Java 9 module system.

 * introduced the concept of a "sealed" configuration.  Once a pool is started, attempts to
   alter its configuration outside of the HikariConfigMXBean will result in an IllegalStateException.

Changes in 2.7.4

 * pull 1026 added support for SQL Server's specific isolation level (SNAPSHOT).

 * issue 926/pull 1022 HikariJNDIFactory should not throw a NamingException or else
   cascading to other object factories cannot occur.

Changes in 2.7.3

 * issue 1003 added PostgreSQL SQL State 0A000 to list of unrecoverable states calling
   for eviction.

 * pull 1002 updated micrometer support due to API changes in their release candidate.

Changes in 2.7.2

 * issue 983 fix logic that determines how many idle connections can be removed, without
   violating the minimumIdle contract.

 * pull 987 add thread name to leak detection messages.

 * issue 982 fix classloader order, try the ThreadContext classloader before other
   classloaders.

 * pull 977 log better messages when connection is evicted.

 * fallback to four digit random pool suffix when SecurityManager prevents writing
   to system properties for the purpose of JVM-wide unique pool identifiers.

Changes in 2.7.1

 * issue 968 Wrong label order in MicrometerMetricsTracker for the connection usage
   metric.

 * issue 967 incorrect bitwise operator value in ConcurrentBag.requite method
   intended to cause parkNanos() to be called every 256 iterations. Thanks to @ztkmkoo
   for finding this.

Changes in 2.4.13

 * backport more efficient contention handling in ConcurrentBag.requite from 2.6.x
   branch.

 * issue 955 fix possible race condition when Statements are closed on different
   threads from which they were created.

Changes in 2.7.0

 * added support for micrometer metrics (currently Alpha-level support).

 * issue 905 mask JDBC password in URLs

 * issue 940 fix Prometheus metric collector for multiple data config

 * issue 941 add support for setting a default schema

 * issue 955 fix possible race condition when Statements are closed on different
   threads from which they were created.

Changes in 2.6.3

 * issue 878 load driver class from ThreadContext classloader if it is not found
   via the regular classloader.

Changes in 2.6.2

 * issue 890 add support for Prometheus metrics and multiple HikariCP pools.

 * issue 880 fix race condition caused by sorting collection while the condition of
   sort can change.

 * issue 876 add support for using a Prometheus CollectorRegistry other than the
   default one.

 * issue 867 support network timeout even for Connection.isValid().

 * issue 866 mark commit state dirty when Connection.getMetaData() is called.

Changes in 2.6.1

 * issue 821 if a disconnection class exception is thrown during initial connection
   setup, do not set the flag that indicates that checkDriverSupport() is complete.

 * issue 835 fix increased CPU consumption under heavy load caused by excessive
   spinning in the ConcurrentBag.requite() method.

 * issue 817 updated behavior of new initializationFailTimeout, please see the
   official documentation for details.

 * issue 742 add direct MXBean accessor methods to HikariDataSource for users who do
   not want run run JMX.

Changes in 2.6.0

 * Redesign of the contention code path resulting in doubling contended throughput; now
   contended pool access retains 98% of the uncontended throughput.

 * issue 793 add new HikariConfig method, setScheduledExecutor(ScheduledExecutorService),
   and deprecate method setScheduledExecutorService(ScheduledThreadPoolExecutor). It is
   unfortunate that the deprecated method has the more accurate name, but its signature
   cannot be changed without breaking binary compatibility.

 * issue 770 add a new property initializationFailTimeout, and deprecate configuration
   property initializationFailFast.

 * issue 774 significantly improve spike load handling.

 * issues 518/769 add new metric for tracking how long physical connection acquisition is
   taking.  DropWizard histogram name "ConnectionCreation", and Prometheus summary name
   "hikaricp_connection_creation_millis".

 * issue 741 cancel HouseKeeper task on pool shutdown. If the ScheduledExecutor being used
   did not belong to HikariCP, this task would remain scheduled after shutdown, causing a
   memory leak.

 * issue 781 more technically accurate wording of pool startup and shutdown log messages.

Changes in 2.5.1

 * issue 719 only reset lastConnectionFailure after a successful dataSource.getConnection()
   call.

 * issue 716 do not scan deeper than 10 nested SQLExceptions, it's typically a trap ...
   a chain that never terminates.

 * issue 714 fix possible issue with cross-thread visibility.  Change pool entry state from
   AtomicInteger w/lazySet() to a volatile int with use of AtomicIntegerFieldUpdater.

Changes in 2.5.0

 * Release 2.5.0 marks the start of a Java 8 HikariCP artifact.  The Java 7 artifact is
   now called "HikariCP-java7".

 * HikariCP 2.5.0 and HikariCP-java7 2.4.8 have identical functionality.

Changes in 2.4.12

 * issue 878 search for driverClass in both HikariCP class classloader and Thread Context
   ClassLoader

Changes in 2.4.11

 * issue 793 add new HikariConfig method, setScheduledExecutor(ScheduledExecutorService),
   and deprecate method setScheduledExecutorService(ScheduledThreadPoolExecutor). It is
   unfortunate that the deprecated method has the more accurate name, but its signature
   cannot be changed without breaking binary compatibility.

 * issue 600 ignore Java 8 default methods when generating proxy classes for Java 7.

Changes in 2.4.10

 * Redesign of the contention code path resulting in doubling contended throughput; now
   contended pool access retains 98% of the uncontended throughput.

 * issue 770 add a new property initializationFailTimeout, and deprecate configuration
   property initializationFailFast.

 * issue 774 significantly improve spike load handling.

 * issue 741 cancel HouseKeeper task on pool shutdown. If the ScheduledExecutor being used
   did not belong to HikariCP, this task would remain scheduled after shutdown, causing a
   memory leak.

Changes in 2.4.9

 * issue 719 only reset lastConnectionFailure after a successful dataSource.getConnection()
   call.

 * issue 716 do not scan deeper than 10 nested SQLExceptions, it's typically a trap ...
   a chain that never terminates.

 * issue 714 fix possible issue with cross-thread visibility.  Change pool entry state from
   AtomicInteger w/lazySet() to a volatile int with use of AtomicIntegerFieldUpdater.

Changes in 2.4.8

 * Release 2.4.8 marks the start of a Java 7 HikariCP artifact, HikariCP-java7, representing
   support for Java 7 entering maintenance mode.

 * Added Connection.commit() call to the fail-fast initialization for databases that
   automatically start a new Connection in a transaction and throw an exception on close
   if it is not committed.

 * feature 694: report if a previously reported leaked connection is returned to the pool

 * issue 689: log a warning if default transaction isolation level cannot be detected.
   This can occur with pseudo-database drivers such as the one for JSonar

 * issue 674: fix regression caused by pull request #450 (overzealous optimisation)

Changes in 2.4.7

 * Miscellaneous stability improvements.

 * Removed Oracle SQL state 61000, added specific error code (2399) to evict connections
   when it is encountered.

 * issue 664: do not recycle PoolEntry objects that have closed their held connection.

 * issue 641, 643: reflection used method String.toUpperCase() without a Locale, which causes
   problems in some locales such as Turkish.

 * pull 632: added support for Prometheus metrics tracker.

 * issue 650: detect Amazon Redshift connection refused error codes.

Changes in 2.4.6

 * Added Oracle SQL error code 61000 (exceeded maximum connect time) to evict connections
   when it is encountered.

 * issue 621: fix NPE in shutdown if invoked during initialization.

 * issue 606, 610: housekeeper thread was running before all class members were
   initialized, causing an unrecoverable exception and disabling idle connection
   retirement (maximumLifetime still applied).

Changes in 2.4.5

 * issue 596: fix bug that occurs when minimumIdle is set to 0, but maximumPoolSize is
   not explicitly set.

 * issue 594: fix incompatibility with various libraries caused by storing a non-String
   object in System properties.

 * issue 593: improve logging when network timeout is not supported by the driver

 * issue 591: improve thread-safety of Statement proxies

Changes in 2.4.4

 * Generate unique sequential pool names, even across container classloaders to avoid
   JMX name collisions when registering pools.

 * Improve pool stability when running on computers using power-saving or sleep modes
   where wake-up previously caused pool to grow to maximum size.

 * Improve pool stability under severe thread-starvation conditions.  Previous code
   could interpret prolonged starvation (exceeding one minute) as non-contiguous clock
   advancement, and reacted by soft-evicting connections (unnecessarily).

 * Added connection timeout rate to Dropwizard metrics (ConnectionTimeoutRate).

 * issue 563: Do not start the house-keeping thread until after pool initialisation
   has succeeded.

 * issue 559: Ensure the pool refill after house-keeping does not enqueue more add
   connection requests if there are already minimumIdle requests pending.

 * issue 555: include support for Java 8 interface 'default' methods during proxy
   generation.

 * issue 547: decreased allowable minimum connectionTimeout and validationTimeout to
   250ms.

 * issue 495: implemented iterator() method on custom FastList to support Tomcat
   memory leak detection.

Changes in 2.3.13

 * issue 512: reduce the number of calls made to Connection.getAutoCommit().

Changes in 2.4.3

 * Improve pool shutdown behavior.  Stop active connection acquisition once the
   shutdown sequence has initiated.

 * Improved detection and reporting of ambiguous pool configuration, when both the
   connection URL and DataSource class names are specified.

Changes in 2.4.2

 * Improve accuracy of timeouts for getConnection() calls by accounting for possibly
   long delay aliveness tests.

 * Improve adherence to minimumIdle goal by closing idle connections starting from
   longest idle time to shortest.  Additionally, stop when minimumIdle is reached even
   if connections exceeding idleTimeout remain (but are still within maxLifetime).

 * Introduce larger variance into maxLifetime to avoid mass connection closing and
   subsequent new connection creation load on the database.  Connections now have a
   maximum lifetime between 97.5-100% of configured maxLifetime.  In the case of the
   default 30 minute lifetime, this generates actual lifetimes with a maximum deviation
   of 45 seconds.  Currently, no attempt is made to further avoid clustering that may
   occur due to randomness.

 * Ongoing com.zaxxer.hikari.metrics refactors. This is not considered public API until
   such time as we announce it. Caveat lector.

 * Performance improvements in the getConnection()/close() hot path.

 * issue 452: fixed race condition when creating an rapidly ramping connections in the
   pool.

 * issue 415: removed use of java.beans classes to allow use of HikariCP with the
   Zulu JRE compact3 profile.

 * issue 406: execute validation query during connection setup to make sure it is
   valid SQL.

Changes in 2.3.12

 * Fixed issue with proxy generation whereby the generated classes contain the
   major version number for Java 8, which makes them incompatible with the Java 7
   runtime.

Changes in 2.4.1

 * issue 380: housekeeper was not being scheduled in the case of a user specified
   ScheduledExecutorService instance.

 * issue 340: rollback change that elides setting the readonly property if the user
   never explicitly configured it.  See discussion in the Github issue tracker.  Also
   fixes binary ABI breakage between 2.3.9 and 2.4.0.

 * issue 379: stop closing idle connections, to keep minimumIdle connections in pool

 * issue 375: fixed InvalidPathException in HikariConfig

 * issue 362: fixed NullPointerException in closing connection (closing statements)

 * issue 357: allow altering the username & password through JMX at runtime

 * issue 349: handle integer Transaction isolation level

 * Throw SQLTransientConnectionException instead of SQLTimeoutException

 * for validating connection, if network time out is set, do not set query timeout too

 * ResultSet.getStatement() should return StatementProxy

Changes in 2.4.0

 * Consolidated distribution into single JVM target (Java 7/8).  Java 6 support has
   entered maintenance mode, bug fixes will continue on the 2.3.x branch.

 * Removed runtime dependency on Javassist by pre-generating proxy classes at build-time.

 * Significantly reduced overhead, and increased reliability, of ConcurrentBag.

 * Reduced garbage generation by 2-3x.

 * Add connection soft-eviction and replacement if backward system clock motion or
   significant forward jumps (greater than 1 minute) are detected.

 * Pool configuration properties and DataSource methods previously marked as
   @Deprecated have been removed.

 * Deprecated HikariDataSource.shutdown() in favor of close().

 * Improve shutdown performance.

 * Allow user specified ScheduledThreadPoolExecutor for housekeeping timer.  Useful
   in applications with dozens or hundreds of pools in the same JVM.

 * Reduce overhead and accuracy of Dropwizard gauges.

Changes in 2.3.7

 * Try harder at resolving the driver by various means when both driverClassName and jdbcUrl
   have been specified.

 * Allow a specifically set DataSource instance to override other settings such as jdbcUrl,
   dataSourceClassName, or driverClassName.

 * Fixed issue where, in the case of a driver-based configuration (jdbcUrl), we were not
   initialising the network timeout Executor.

 * Fixed race condition uncovered during load-testing in which the connections in the pool
   can spike to the maximum pool size when many connections reach their maxLifetime at the
   same time.

Changes in 2.3.6

 * Allow explicit definition of driverClassName to override DriverManager.getDriver(url)
   located driver.

 * Fixed a rare issue where a Connection that is held out of the pool, and never used by
   the holding thread, upon returning to the pool might be given to another thread without
   an aliveness test.

Changes in 2.3.5

 * Fixed regression caused by enhancement #279 that imposed a runtime dependency on
   Dropwizard metrics.

Changes in 2.3.4

 * Fixed class cast exception when setting the HealthCheckRegistry via JNDI lookup.

 * Allow Dropwizard MetricRegistry/HealthCheckRegistry to be set after pool startup --
   one time only.

 * Make logger in BaseHikariPool non-static and use getClass() to log messages as the
   implementation class rather than as BaseHikariPool.

 * Removed deprecation from connectionInitSql, it will be allowed.

 * Made suspect/resume lock non-static (should be be shared across pools).

 * Improved unwrap() behavior in the Hibernate HikariConnectionProvider.

 * Improved leak detection log

Changes in 2.3.3

 * Fixed bad interaction with PostgeSQL JDBC driver whereby a SQLException thrown by
   PostgreSQL where the getNextException() call returns the original exception and causes
   an infinite loop in HikariCP (and eventual stack overflow).

 * Throw a typed Exception rather than a simple RuntimeException when pool initialization
   fails.

 * Allow Dropwizard Metrics and HealthChecks to be configured by a JNDI lookup.

Changes in 2.3.2

 * Add support for Dropwizard HealthChecks through the introduction of two initial health
   checks: ConnectivityCheck and Connection99Percent.  See the Github project wiki for
   documentation.

 * Allow a lower maxLifetime setting of 30 seconds (compared to previous 120 second limit)

 * Improve the message displayed when a connection leak is detected.

 * Fixed a bug where Connection.setNetworkTimeout() was called on an already closed connection
   resulting in a warning log from the AS400 JDBC driver.

Changes in 2.3.1

 * Work around a bug in the MySQL Connector/J implementation of Connection.setNetworkTimeout()
   that results in non-deterministic asynchronous application of the timeout, resulting in an
   NPE from the MySQL driver when setNetworkTimeout() is followed immediately by close().

 * Introduced a separate validationTimeout property, distict from connectionTimeout, to allow
   greater control for some deployments that desire a long (or infinite) connectionTimeout
   but expect the aliveness check to succeed for fail within a different (shorter) amount of
   time.

Changes in 2.3.0

 * Support pool suspend/resume to support certain failover scenarios.

 * Fix theoretical race in JDBC 4.0 detection support.

 * Improve shutdown() semantics to avoid exceptions as connections are forcefully
   aborted.

 * Unregister Codahale metrics at shutdown, if metrics are enabled.

 * Major internal project layout restructuring to allow shared use of common code
   between the Java 6/7 and Java 8 versions.

 * Fixed bug where two pools in the same VM (and ClassLoading domain), using drivers
   with differing JDBC support levels, would fail unless both pools were using
   connectionTestQuery.

 * Improved timeliness of maxLifetime evictions, while increasing performance of
   getConnection() slightly as a side-effect.

 * Fixed bug in HikariDataSource unwrap() semantics.

 * Allow a lower leakDetectionThreshold of 2 seconds.

 * Fixed bug when using the HikariJNDIFactory that required the presence of
   Codahale metrics.

 * Support initializationFailFast even when minimumIdle = 0

 * Log internal pool inconsistencies rather than throwing exceptions that might
   disrupt internal executors.

 * Guard against poor or unreliable System.nanoTime() implementations.

Changes in 2.2.5

 * Fixes for Java 6 compatibility.

 * Implement full transaction state tracking.  This allows HikariCP to bypass
   the automatic rollback when connections are returned to the pool if the
   transaction state is "clean".

 * Rename MBean closeIdleConnections() to softEvictConnections() and implement
   "evict on return" semantics.

 * Fixed bug in code that sets HikariConfig values from a Properties instance
   that prevented defaults from being read properly.

 * Fixed an obscure bug in connection creation with a driver that throws an
   exception when setTransactionIsolation() is called with the value returned
   by getTransactionIsolation().  We now bypass setTransactionIsolation() if
   the user has not configured an isolation level (using the default).

 * Fix a bug where DataSource.loginTimeout() was always being set to 1 second.

 * Fix bug where some drivers return 0 from Connection.getNetworkTimeout(),
   and yet throw SQLFeatureNotSupportedException when setNetworkTimeout() is
   called. This broke they way that HikariCP had implemented JDBC 4.1 support
   detection.

Changes in 2.2.4

 * Generate proxy classes into the same protection domain as the HikariCP
   loaded classes.  This solves issues with signed jars.

 * Improve accuracy of pool statistics available to JMX and logged at debug
   level (at a slight performance cost).

 * Fixed issue where after a database down condition, and when minimumIdle is
   set to 0, when the database connectivity is restored the connections could
   ramp up to the maximum pool size.  Eventually, idleTimeout and maxLifetime
   would restore normal pool conditions, but it was still undesirable behavior.

 * Improved connection timeout handling by using Connection.setNetworkTimeout()
   if available (JDBC 4.1).

 * driverClassName is no longer a required property when jdbcUrl is specified.
   Omitting this property only works for compliant drivers.

 * Add auto-detection of support for Statement.setQueryTimeout() used in the
   alive check.  Fixes failures with test queries on the PostgreSQL driver
   when not using JDBC4 isValid() alive checks.

 * The pool now defaults to fail-fast initialization.  If you need to start
   your application without/before the database, you will need to explicitly
   set initializationFailFast to false.

 * Dropwizard/Codahale metrics are now supported via the setMetricRegistry()
   method in HikariConfig and in HikariDataSource.

 * Fixed issue with pool initialization of MySQL after default value of
   initializationFailFast property was changed to false.

 * Further shadow runtime dependency on Codahale metrics from reflection
   performed by Spring and other IoC containers.

 * Fix issue where network timeout was not properly restored to its default
   value after modifying it for the duration of the addConnection() method.

Changes in 2.1.0

 * Significant internal refactor supporting creation of new proxy instances
   (throwaway) around Connections for each call to getConnection().  This
   can avoid issues where a thread continues to try to use a connection
   after it is closed [returned to the pool].

 * Allow HikariConfig(String propertyFileName) to load properties file from
   classloader as a stream, with fall-back to the file-system.

 * Allow loading of properties file specified by -Dhikaricp.configurationFile
   system property when using the default HikariConfig() or HikariDataSource()
   constructors.

 * Fixed accounting issue with totalConnections when aborting connections
   during shutdown, causing a warning message to be logged.

 * Fixed regression in Java 8 codeline that would prevent minimumIdle from
   being set before maxPoolSize.

 * Fixed regression with Tomcat carping about ThreadLocal variables held after
   web application restart

 * Change to make HikariConfig.getTransactionIsolation()/setTransactionIsolation()
   follow proper bean semantics.

 * Fixed issue where connections created in the pool would skip the alive check
   the first time they were used.

Changes in 2.0.1

 * Split project into Java 6/7 and Java 8 components.

 * Fixed issue in JNDI object factory which would not allow JNDI-defined
   DataSource properties to pass-thru to the pool.

 * Fixed issue where under certain conditions getConnection() could
   timeout prematurely.

 * Fixed issue where user-defined pool name would be overridden by the
   automatically generated name.

 * Fixed NPE when one of either username and password is defined, and the
   other is null.

 * Fixed issue tracking the statements when there are mixed statement
   types (Statement, PreparedStatement, etc.) open on the connection and
   the number of unclosed statements exceeds 32.

 * Fixed issue where housekeeping threads would add idle connections
   even when minimumIdle was 0.

 * Fixed issue where Wrapper.isWrapperFor() and Wrapper.unwrap() calls
   did not recurse as per specification.

 * HikariDataSource now implements the Closable interface.

 * Integrated change to allow specifying a ThreadGroup for thread
   creation is certain restricted environments.

Changes in 1.4.0

 *) Fix bug that did not allow minIdle property to be set.

Changes in 1.3.9

 *) Added pool name to housekeeping thread name to make thread dumps
    more meaningful in containers with multiple pools.

 *) Improved shutdown semantics; make a concerted effort to close
    idle connections and abort or close active connections.

 *) Performance enhancements.

Changes in 1.3.8

 *) Fixed incorrect logic when using JDBC4 isValid() test for alive
    status of connection.

Changes in 1.3.7

 *) Added JNDI object factory (com.zaxxer.hikari.HikariJNDIFactory)
    for Tomcat and other containers that prefer JNDI-registered DataSource
    factories.

 *) Fix NPE that can occur when connections cannot be created and
    callers to getConnection() timeout.

 *) Various bug fixes and minor enhancements.

Changes in 1.3.6

 *) Include connection failure cause in calls to getConnection() that
    timeout (due to connection failure).  Removed chatty logging.

 *) Java8 Compatibility fixes.

 *) Include pool name in logging messages.  Thanks for the contribution
    @jaredstehler.

Changes in 1.3.5

 *) Fixed a regression in the Javassist code generation.

 *) Various bug fixes and minor enhancements.

Changes in 1.3.4

 *) Added new property isolateInternalQueries used to control whether
    internal pool queries such as connection alive tests are isolated
    in their own transaction.

 *) Added properties for DriverManager (driverClassName) and JDBC URL-based
    (jdbcUrl) configuration.  1999 called and wants its JDBC driver back.

 *) Added new username and password properties to allow default authentication
    for connections.

 *) Added support for the getConnection(username, password) method signature
    to HikariDataSource.

 *) Added new property readOnly to control the default read-only status
    of connections in the pool.

 *) Deprecated acquireIncrement property.

 *) Deprecated acquireRetries property.

 *) Deprecated acquireRetryDelay property.

 *) Deprecated minimumPoolSize property.

 *) Added new property minimumIdle used to control the minimum number of
    idle connections the pool should try to maintain on a running basis.

 *) Added evictConnection(Connection) method to HikariDataSource to allow
    special cases where users wish to forcibly eject a connection from
    the pool.  To use used cautiously, read the JavaDoc before using.

 *) Various bug fixes and minor enhancements.

Changes in 1.3.3

 *) Removed shared state contention that was causing excessive CPU cache-line
    flushing.  Nearly 4x improvement in Connection acquisition/release
    performance.

 *) Fixed issue with Tomcat carping about ThreadLocal variables held after
    web application restart.

 *) Fixed issue where the maximum configured connections could be overrun
    during large burst requests for connections.

Changes in 1.3.2

 *) Java 6 compatibility.

 *) HikariDataSource now extends HikariConfig, so pool properties can be
    set directly on a HikariDataSource without need to create a  HikariConfig.
    The cost of doing so is a small runtime cost due to the fact that an
    "is initialized" check must be performed on every invocation of
    getConnection() due to lazy initialization of the pool.

 *) Added Sybase-specific disconnect error codes to SQLException snooping.

 *) Added HikariConfig.setCatalog() method to set DataSource catalog.

 *) Add DataSource.close() method that is synonymous  with shutdown().

 *) More performance improvements (never ending).

 *) Moved benchmarks to https://github.com/brettwooldridge/HikariCP-benchmark

Changes in 1.3.0

 *) Pool is now backed by a custom lock-less ConcurrentBag that
    provides superior performance to LinkedBlockingQueue and
    LinkedTransferQueue for usage patterns of connection pools.

 *) Fixed bugs reported against the 1.2.9 release.

 *) Added more detailed logging for broken connections and failures
    during new connection creation.

Changes in 1.2.9

 *) Added a fail-fast option for pool initialization.  If enabled, a
    RuntimeException will be thrown if there are errors during pool
    initialization.

 *) Made the registration of the HikariCP MBeans optional.  They now
    default to not being registered.  Registering them causes a minor
    performance hit due to additional pool data collection in
    HikariDataSource.getConnection().

 *) Added the SQLException message to the log entry when an exception
    occurs during physical connection acquisition.

 *) Implemented an orderly shutdown of the pool via the shutdown() method
    on HikariDataSource.

 *) Listened to "Adele - Live At The Royal Albert Hall" on endless loop.

Changes in 1.2.8

 *) Fixed a critical bug introduced in 1.2.7 occurring when the number of
    concurrently open statements exceeds sixteen.

Changes in 1.2.7

 *) Finally achieved performance parity between the generated delegates
    and the former method of instrumenting driver classes directly.

 *) Improved generated delegate code. Removed unnecessary casts, moved
    to a static proxy factory rather than a singleton (performance win).

 *) Improved performance of FastStatementList (primary source of speed-up
    to reach parity with former instrumentation code).

 *) Removed aliveness check on connection creation.

 *) Track connection isolation level and only reset if the state has
    become "dirty".  Avoids unnecessary round trip to the DB during the
    aliveness check.

 *) Added interface IConnectionCustomizer and related HikariConfig
    property 'connectionCustomizerClassName' to allow users to specify
    a connection customization implementation.

Changes in 1.2.6

 *) Fixed regression that caused IndexOutOfBounds when multiple unclosed
    Statements existed at the time of Connection.close().

 *) Fixed incorrect pom.xml dependency on Hibernate.

Changes in 1.2.5

 *) Instrumentation mode (agent) removed due to narrowing gap between
    delegation mode and instrumentation (and to simplify the code base).

 *) Added setDataSource() to HikariConfig to allow a DataSource instance
    to be explicitly wrapped by the pool.  Only available when creating
    HikariConfig programmatically or constructing HikariConfig from a
    java.util.Properties instance.

 *) Fixed Hibernate threading issue (certain usage patterns) introduced
    in 1.2.2.

 *) Fixed issue observed with PostgreSQL whereby the query that tests the
    connection for "aliveness" also starts a transaction (when auto-commit
    is false), thereby causing a later failure when we tried to set the
    transaction isolation level.

 *) Fixed issue where idleTimeout could not be set to 0, thereby disabling
    it. Incorrect value validation caused 0 to be rejected as a valid value.

Changes in 1.2.4

 *) Fix another Hibernate-related issue whereby an NPE is encountered when
    a thread that was not the thread that obtained a Connection tries to
    interact with that Connection.

Changes in 1.2.3

 *) Fix internal (but suppressed) exception during rollback of connections
    returned to the pool with auto-commit turned off.

 *) Fix a reflection issue that causes Hibernate failures due to the
    CallableStatement interface being incorrectly injected into statement
    proxies that are PreparedStatement or Statement instances.

Changes in 1.2.2

 *) Perform a rollback() on connections returned to the pool with
    auto commit disabled.

 *) Add a constructor for HikariConfig that accepts a Properties
    object.

 *) Speed improvements for delegate mode.

 *) Fix a bug where connection timeouts could not be disabled.

 *) Permit setting the DataSource logWriter either on the HikariDataSource
    or via addDataSourceProperty() on the HikariConfig.

 *) Add transactionIsolation property to allow setting the default
    transaction isolation level for connections.

Changes in 1.2.1

 *) Clear SQL warnings before returning a connection to the user.

 *) Added asynchronous connection backfill strategy that triggers
    when the pool becomes empty as a result of dispatching a
    connection.

 *) Changed default acquireIncrement to 1, set minimum timeout of
    100ms for acquiring a connection.

Changes in 1.1.9

 *) Added connectionInitSql property to allow setting connection
    properties when a new connection is created.

 *) Added setDataSourceProperties() setter to HikariConfig to
    allow easier configuration though Spring.


================================================
FILE: KEYS.txt
================================================
# GPG Release Key Fingerprints
Brett Wooldridge <brett.wooldridge@gmail.com> F3A9 0E6B 10E8 09F8 51AB  4FC5 4CC0 8E7F 47C3 EC76
Leo Bayer        <lfbayer@gmail.com>          9579 802D C3E1 5DE9 C389  239F C0D4 8A11 9CE7 EE7B


================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions.

"License" shall mean the terms and conditions for use, reproduction, and
distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright
owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities
that control, are controlled by, or are under common control with that entity.
For the purposes of this definition, "control" means (i) the power, direct or
indirect, to cause the direction or management of such entity, whether by
contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising
permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including
but not limited to software source code, documentation source, and configuration
files.

"Object" form shall mean any form resulting from mechanical transformation or
translation of a Source form, including but not limited to compiled object code,
generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made
available under the License, as indicated by a copyright notice that is included
in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that
is based on (or derived from) the Work and for which the editorial revisions,
annotations, elaborations, or other modifications represent, as a whole, an
original work of authorship. For the purposes of this License, Derivative Works
shall not include works that remain separable from, or merely link (or bind by
name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version
of the Work and any modifications or additions to that Work or Derivative Works
thereof, that is intentionally submitted to Licensor for inclusion in the Work
by the copyright owner or by an individual or Legal Entity authorized to submit
on behalf of the copyright owner. For the purposes of this definition,
"submitted" means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems, and
issue tracking systems that are managed by, or on behalf of, the Licensor for
the purpose of discussing and improving the Work, but excluding communication
that is conspicuously marked or otherwise designated in writing by the copyright
owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
of whom a Contribution has been received by Licensor and subsequently
incorporated within the Work.

2. Grant of Copyright License.

Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the Work and such
Derivative Works in Source or Object form.

3. Grant of Patent License.

Subject to the terms and conditions of this License, each Contributor hereby
grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
irrevocable (except as stated in this section) patent license to make, have
made, use, offer to sell, sell, import, and otherwise transfer the Work, where
such license applies only to those patent claims licensable by such Contributor
that are necessarily infringed by their Contribution(s) alone or by combination
of their Contribution(s) with the Work to which such Contribution(s) was
submitted. If You institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work or a
Contribution incorporated within the Work constitutes direct or contributory
patent infringement, then any patent licenses granted to You under this License
for that Work shall terminate as of the date such litigation is filed.

4. Redistribution.

You may reproduce and distribute copies of the Work or Derivative Works thereof
in any medium, with or without modifications, and in Source or Object form,
provided that You meet the following conditions:

You must give any other recipients of the Work or Derivative Works a copy of
this License; and
You must cause any modified files to carry prominent notices stating that You
changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute,
all copyright, patent, trademark, and attribution notices from the Source form
of the Work, excluding those notices that do not pertain to any part of the
Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any
Derivative Works that You distribute must include a readable copy of the
attribution notices contained within such NOTICE file, excluding those notices
that do not pertain to any part of the Derivative Works, in at least one of the
following places: within a NOTICE text file distributed as part of the
Derivative Works; within the Source form or documentation, if provided along
with the Derivative Works; or, within a display generated by the Derivative
Works, if and wherever such third-party notices normally appear. The contents of
the NOTICE file are for informational purposes only and do not modify the
License. You may add Your own attribution notices within Derivative Works that
You distribute, alongside or as an addendum to the NOTICE text from the Work,
provided that such additional attribution notices cannot be construed as
modifying the License.
You may add Your own copyright statement to Your modifications and may provide
additional or different license terms and conditions for use, reproduction, or
distribution of Your modifications, or for any such Derivative Works as a whole,
provided Your use, reproduction, and distribution of the Work otherwise complies
with the conditions stated in this License.

5. Submission of Contributions.

Unless You explicitly state otherwise, any Contribution intentionally submitted
for inclusion in the Work by You to the Licensor shall be under the terms and
conditions of this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify the terms of
any separate license agreement you may have executed with Licensor regarding
such Contributions.

6. Trademarks.

This License does not grant permission to use the trade names, trademarks,
service marks, or product names of the Licensor, except as required for
reasonable and customary use in describing the origin of the Work and
reproducing the content of the NOTICE file.

7. Disclaimer of Warranty.

Unless required by applicable law or agreed to in writing, Licensor provides the
Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
including, without limitation, any warranties or conditions of TITLE,
NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
solely responsible for determining the appropriateness of using or
redistributing the Work and assume any risks associated with Your exercise of
permissions under this License.

8. Limitation of Liability.

In no event and under no legal theory, whether in tort (including negligence),
contract, or otherwise, unless required by applicable law (such as deliberate
and grossly negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special, incidental,
or consequential damages of any character arising as a result of this License or
out of the use or inability to use the Work (including but not limited to
damages for loss of goodwill, work stoppage, computer failure or malfunction, or
any and all other commercial damages or losses), even if such Contributor has
been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability.

While redistributing the Work or Derivative Works thereof, You may choose to
offer, and charge a fee for, acceptance of support, warranty, indemnity, or
other liability obligations and/or rights consistent with this License. However,
in accepting such obligations, You may act only on Your own behalf and on Your
sole responsibility, not on behalf of any other Contributor, and only if You
agree to indemnify, defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason of your
accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own
identifying information. (Don't include the brackets!) The text should be
enclosed in the appropriate comment syntax for the file format. We also
recommend that a file or class name and description of purpose be included on
the same "printed page" as the copyright notice for easier identification within
third-party archives.

   Copyright [yyyy] [name of copyright owner]

   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.


================================================
FILE: README.md
================================================
<h1><img src="https://github.com/brettwooldridge/HikariCP/wiki/Hikari.png"> HikariCP<sup><sup>&nbsp;It's Faster.</sup></sup><sub><sub><sup>Hi·ka·ri [hi·ka·'lē] &#40;<i>Origin: Japanese</i>): light; ray.</sup></sub></sub></h1><br>

[![][Build Status img]][Build Status]
[![][Coverage Status img]][Coverage Status]
[![][license img]][license]
![Maven Central Version](https://img.shields.io/maven-central/v/com.zaxxer/HikariCP?label=maven%20central&link=https%3A%2F%2Fcentral.sonatype.com%2Fartifact%2Fcom.zaxxer%2FHikariCP)
[![][Javadocs img]][Javadocs]
[![][Librapay img]][Librapay]

Fast, simple, reliable.  HikariCP is a "zero-overhead" production ready JDBC connection pool.  At roughly 165Kb, the library is very light.  Read about [how we do it here](https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole).

&nbsp;&nbsp;&nbsp;<sup>**"Simplicity is prerequisite for reliability."**<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- *Dr. Edsger Dijkstra*</sup>

----------------------------------------------------

> [!IMPORTANT]
> In order to avoid a rare condition where the pool goes to zero and does not recover it is necessary to configure *TCP keepalive*. Some JDBC drivers support this via properties, for example ``tcpKeepAlive=true`` on PostgreSQL, but in any case it can also be configured at the OS-level. See [Setting OS TCP Keepalive](https://github.com/brettwooldridge/HikariCP/wiki/Setting-Driver-or-OS-TCP-Keepalive) and/or [TCP keepalive for a better PostgreSQL experience](https://www.cybertec-postgresql.com/en/tcp-keepalive-for-a-better-postgresql-experience/#setting-tcp-keepalive-parameters-on-the-operating-system).

----------------------------------------------------

### Index
* [Artifacts](#artifacts)
* [JMH Benchmarks](#checkered_flag-jmh-benchmarks)
* [Analyses](#microscope-analyses)
  * [Spike Demand Pool Comparison](#spike-demand-pool-comparison)
  * [You're probably doing it wrong](#youre-probably-doing-it-wrong)
  * [WIX Engineering Analysis](#wix-engineering-analysis)
  * [Failure: Pools behaving badly](#failure-pools-behaving-badly)
* [User Testimonials](#family-user-testimonials) <br>
* [Configuration](#gear-configuration-knobs-baby) <br>
  * [Essentials](#essentials)
  * [Frequently used](#frequently-used)
  * [Infrequently used](#infrequently-used)
* [Initialization](#rocket-initialization)

----------------------------------------------------

### Artifacts

_**Java 11+** maven artifact:_
```xml
<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>7.0.2</version>
</dependency>
```
_Java 8 maven artifact (*deprecated*):_
```xml
<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>4.0.3</version>
</dependency>
```
_Java 7 maven artifact (*deprecated*):_
```xml
<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP-java7</artifactId>
   <version>2.4.13</version>
</dependency>
```
_Java 6 maven artifact (*deprecated*):_
```xml
<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP-java6</artifactId>
   <version>2.3.13</version>
</dependency>
```
Or [download from here](http://search.maven.org/#search%7Cga%7C1%7Ccom.zaxxer.hikaricp).

----------------------------------------------------

### :checkered_flag: JMH Benchmarks

Microbenchmarks were created to isolate and measure the overhead of pools using the [JMH microbenchmark framework](http://openjdk.java.net/projects/code-tools/jmh/). You can checkout the [HikariCP benchmark project for details](https://github.com/brettwooldridge/HikariCP-benchmark) and review/run the benchmarks yourself.

![](https://github.com/brettwooldridge/HikariCP/wiki/HikariCP-bench-2.6.0.png)

 * One *Connection Cycle* is defined as single ``DataSource.getConnection()``/``Connection.close()``.
 * One *Statement Cycle* is defined as single ``Connection.prepareStatement()``, ``Statement.execute()``, ``Statement.close()``.

<sup>
<sup>1</sup> Versions: HikariCP 2.6.0, commons-dbcp2 2.1.1, Tomcat 8.0.24, Vibur 16.1, c3p0 0.9.5.2, Java 8u111 <br/>
<sup>2</sup> Intel Core i7-3770 CPU @ 3.40GHz <br/>
<sup>3</sup> Uncontended benchmark: 32 threads/32 connections, Contended benchmark: 32 threads, 16 connections <br/>
<sup>4</sup> Apache Tomcat fails to complete the Statement benchmark when the Tomcat <i>StatementFinalizer</i> is used <a href="https://raw.githubusercontent.com/wiki/brettwooldridge/HikariCP/markdown/Tomcat-Statement-Failure.md">due to excessive garbage collection times</a><br/>
<sup>5</sup> Apache DBCP fails to complete the Statement benchmark <a href="https://raw.githubusercontent.com/wiki/brettwooldridge/HikariCP/markdown/Dbcp2-Statement-Failure.md">due to excessive garbage collection times</a>
</sup>

----------------------------------------------------
### :microscope: Analyses

#### Spike Demand Pool Comparison
<a href="https://github.com/brettwooldridge/HikariCP/blob/dev/documents/Welcome-To-The-Jungle.md"><img width="400" align="right" src="https://github.com/brettwooldridge/HikariCP/wiki/Spike-Hikari.png"></a>
Analysis of HikariCP v2.6, in comparison to other pools, in relation to a unique "spike demand" load.

The customer's environment imposed a high cost of new connection acquisition, and a requirement for a dynamically-sized pool, but yet a need for responsiveness to request spikes.  Read about the spike demand handling [here](https://github.com/brettwooldridge/HikariCP/blob/dev/documents/Welcome-To-The-Jungle.md).
<br/>
<br/>
#### You're [probably] doing it wrong
<a href="https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing"><img width="200" align="right" src="https://github.com/brettwooldridge/HikariCP/wiki/Postgres_Chart.png"></a>
AKA *"What you probably didn't know about connection pool sizing"*.  Watch a video from the Oracle Real-world Performance group, and learn about why database connections do not need to be so numerous as they often are. In fact, too many connections have a clear and demonstrable *negative* impact on performance; a 50x difference in the case of the Oracle demonstration.  [Read on to find out](https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing).
<br/>
#### WIX Engineering Analysis
<a href="https://www.wix.engineering/blog/how-does-hikaricp-compare-to-other-connection-pools"><img width="180" align="left" src="https://github.com/brettwooldridge/HikariCP/wiki/Wix-Engineering.png"></a>
We'd like to thank the guys over at WIX for the unsolicited and deep write-up about HikariCP on their [engineering blog](https://www.wix.engineering/post/how-does-hikaricp-compare-to-other-connection-pools).  Take a look if you have time.
<br/>
<br/>
<br/>
#### Failure: Pools behaving badly
Read our interesting ["Database down" pool challenge](https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down).

----------------------------------------------------
#### "Imitation Is The Sincerest Form Of Plagiarism" - <sub><sup>anonymous</sup></sub>
Open source software like HikariCP, like any product, competes in the free market.  We get it.  We understand that product advancements, once public, are often co-opted.  And we understand that ideas can arise from the zeitgeist; simultaneously and independently.  But the timeline of innovation, particularly in open source projects, is also clear and we want our users to understand the direction of flow of innovation in our space.  It could be demoralizing to see the result of hundreds of hours of thought and research co-opted so easily, and perhaps that is inherent in a free marketplace, but we are not demoralized.  *We are motivated; to widen the gap.*

----------------------------------------------------
### :family: User Testimonials

[![](https://github.com/brettwooldridge/HikariCP/wiki/tweet3.png)](https://twitter.com/jkuipers)<br/>
[![](https://github.com/brettwooldridge/HikariCP/wiki/tweet1.png)](https://twitter.com/steve_objectify)<br/>
[![](https://github.com/brettwooldridge/HikariCP/wiki/tweet2.png)](https://twitter.com/brettemeyer)<br/>
[![](https://github.com/brettwooldridge/HikariCP/wiki/tweet4.png)](https://twitter.com/dgomesbr/status/527521925401419776)

If you like this project, consider leaving a word for us on social media:

[![](https://raw.github.com/wiki/brettwooldridge/HikariCP/twitter.png)](https://twitter.com/share?text=Interesting%20JDBC%20Connection%20Pool&hashtags=HikariCP&url=https%3A%2F%2Fgithub.com%2Fbrettwooldridge%2FHikariCP)&nbsp;[![](https://raw.github.com/wiki/brettwooldridge/HikariCP/facebook.png)](http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fgithub.com%2Fbrettwooldridge%2FHikariCP&width&layout=standard&action=recommend&show_faces=true&share=false&height=80)
------------------------------
### :gear: Configuration (knobs, baby!)
HikariCP comes with *sane* defaults that perform well in most deployments without additional tweaking. **Every property is optional, except for the "essentials" marked below.**

<sup>&#128206;</sup>&nbsp;*HikariCP uses milliseconds for all time values.*

&#128680;&nbsp;HikariCP relies on accurate timers for both performance and reliability. It is *imperative* that your server is synchronized with a time-source such as an NTP server. *Especially* if your server is running within a virtual machine.  Why? [Read more here](https://dba.stackexchange.com/a/171020). **Do not rely on hypervisor settings to "synchronize" the clock of the virtual machine. Configure time-source synchronization inside the virtual machine.**   If you come asking for support on an issue that turns out to be caused by lack time synchronization, you will be taunted publicly on Twitter.

#### Essentials

&#128292;``dataSourceClassName``<br/>
This is the name of the ``DataSource`` class provided by the JDBC driver.  Consult the
documentation for your specific JDBC driver to get this class name, or see the [table](https://github.com/brettwooldridge/HikariCP#popular-datasource-class-names) below.
Note XA data sources are not supported.  XA requires a real transaction manager like
[bitronix](https://github.com/bitronix/btm). Note that you do not need this property if you are using
``jdbcUrl`` for "old-school" DriverManager-based JDBC driver configuration.
*Default: none*

*- or -*

&#128292;``jdbcUrl``<br/>
This property directs HikariCP to use "DriverManager-based" configuration.  We feel that DataSource-based
configuration (above) is superior for a variety of reasons (see below), but for many deployments there is
little significant difference.  **When using this property with "old" drivers, you may also need to set
the  ``driverClassName`` property, but try it first without.**  Note that if this property is used, you may
still use *DataSource* properties to configure your driver and is in fact recommended over driver parameters
specified in the URL itself.
*Default: none*

***

&#128292;``username``<br/>
This property sets the default authentication username used when obtaining *Connections* from
the underlying driver.  Note that for DataSources this works in a very deterministic fashion by
calling ``DataSource.getConnection(*username*, password)`` on the underlying DataSource.  However,
for Driver-based configurations, every driver is different.  In the case of Driver-based, HikariCP
will use this ``username`` property to set a ``user`` property in the ``Properties`` passed to the
driver's ``DriverManager.getConnection(jdbcUrl, props)`` call.  If this is not what you need,
skip this method entirely and call ``addDataSourceProperty("username", ...)``, for example.
*Default: none*

&#128292;``password``<br/>
This property sets the default authentication password used when obtaining *Connections* from
the underlying driver. Note that for DataSources this works in a very deterministic fashion by
calling ``DataSource.getConnection(username, *password*)`` on the underlying DataSource.  However,
for Driver-based configurations, every driver is different.  In the case of Driver-based, HikariCP
will use this ``password`` property to set a ``password`` property in the ``Properties`` passed to the
driver's ``DriverManager.getConnection(jdbcUrl, props)`` call.  If this is not what you need,
skip this method entirely and call ``addDataSourceProperty("pass", ...)``, for example.
*Default: none*

#### Frequently used

&#9989;``autoCommit``<br/>
This property controls the default auto-commit behavior of connections returned from the pool.
It is a boolean value.
*Default: true*

&#9203;``connectionTimeout``<br/>
This property controls the maximum number of milliseconds that a client (that's you) will wait
for a connection from the pool.  If this time is exceeded without a connection becoming
available, a SQLException will be thrown.  Lowest acceptable connection timeout is 250 ms.
*Default: 30000 (30 seconds)*

&#9203;``idleTimeout``<br/>
This property controls the maximum amount of time that a connection is allowed to sit idle in the
pool.  **This setting only applies when ``minimumIdle`` is defined to be less than ``maximumPoolSize``.**
Idle connections will *not* be retired once the pool reaches ``minimumIdle`` connections.  Whether a
connection is retired as idle or not is subject to a maximum variation of +30 seconds, and average
variation of +15 seconds.  A connection will never be retired as idle *before* this timeout.  A value
of 0 means that idle connections are never removed from the pool.  The minimum allowed value is 10000ms
(10 seconds).
*Default: 600000 (10 minutes)*

&#9203;``keepaliveTime``<br/>
This property controls how frequently HikariCP will attempt to keep a connection alive, in order to prevent
it from being timed out by the database or network infrastructure. This value must be less than the
`maxLifetime` value. A "keepalive" will only occur on an idle connection. When the time arrives for a "keepalive"
against a given connection, that connection will be removed from the pool, "pinged", and then returned to the
pool. The 'ping' is one of either: invocation of the JDBC4 `isValid()` method, or execution of the
`connectionTestQuery`. Typically, the duration out-of-the-pool should be measured in single digit milliseconds
or even sub-millisecond, and therefore should have little or no noticeable performance impact. The minimum
allowed value is 30000ms (30 seconds), but a value in the range of minutes is most desirable.
*Default: 120000 (2 minutes)*

&#9203;``maxLifetime``<br/>
This property controls the maximum lifetime of a connection in the pool.  An in-use connection will
never be retired, only when it is closed will it then be removed.  On a connection-by-connection
basis, minor negative attenuation is applied to avoid mass-extinction in the pool.  **We strongly recommend
setting this value, and it should be several seconds shorter than any database or infrastructure imposed
connection time limit.**  A value of 0 indicates no maximum lifetime (infinite lifetime), subject of
course to the ``idleTimeout`` setting.  The minimum allowed value is 30000ms (30 seconds).
*Default: 1800000 (30 minutes)*

&#128292;``connectionTestQuery``<br/>
**If your driver supports JDBC4 we strongly recommend not setting this property.** This is for
"legacy" drivers that do not support the JDBC4 ``Connection.isValid() API``.  This is the query that
will be executed just before a connection is given to you from the pool to validate that the
connection to the database is still alive. *Again, try running the pool without this property,
HikariCP will log an error if your driver is not JDBC4 compliant to let you know.*
*Default: none*

&#128290;``minimumIdle``<br/>
This property controls the minimum number of *idle connections* that HikariCP tries to maintain
in the pool.  If the idle connections dip below this value and total connections in the pool are less than ``maximumPoolSize``,
HikariCP will make a best effort to add additional connections quickly and efficiently.
However, for maximum performance and responsiveness to spike demands,
we recommend *not* setting this value and instead allowing HikariCP to act as a *fixed size* connection pool.
*Default: same as maximumPoolSize*

&#128290;``maximumPoolSize``<br/>
This property controls the maximum size that the pool is allowed to reach, including both
idle and in-use connections.  Basically this value will determine the maximum number of
actual connections to the database backend.  A reasonable value for this is best determined
by your execution environment.  When the pool reaches this size, and no idle connections are
available, calls to getConnection() will block for up to ``connectionTimeout`` milliseconds
before timing out.  Please read [about pool sizing](https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing).
*Default: 10*

&#128200;``metricRegistry``<br/>
This property is only available via programmatic configuration or IoC container.  This property
allows you to specify an instance of a *Codahale/Dropwizard* ``MetricRegistry`` to be used by the
pool to record various metrics.  See the [Metrics](https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-Metrics)
wiki page for details.
*Default: none*

&#128200;``healthCheckRegistry``<br/>
This property is only available via programmatic configuration or IoC container.  This property
allows you to specify an instance of a *Codahale/Dropwizard* ``HealthCheckRegistry`` to be used by the
pool to report current health information.  See the [Health Checks](https://github.com/brettwooldridge/HikariCP/wiki/Dropwizard-HealthChecks)
wiki page for details.
*Default: none*

&#128292;``poolName``<br/>
This property represents a user-defined name for the connection pool and appears mainly
in logging and JMX management consoles to identify pools and pool configurations.
*Default: auto-generated*

#### Infrequently used

&#9203;``initializationFailTimeout``<br/>
This property controls whether the pool will "fail fast" if the pool cannot be seeded with
an initial connection successfully.  Any positive number is taken to be the number of
milliseconds to attempt to acquire an initial connection; the application thread will be
blocked during this period.  If a connection cannot be acquired before this timeout occurs,
an exception will be thrown.  This timeout is applied *after* the ``connectionTimeout``
period.  If the value is zero (0), HikariCP will attempt to obtain and validate a connection.
If a connection is obtained, but fails validation, an exception will be thrown and the pool
not started.  However, if a connection cannot be obtained, the pool will start, but later
efforts to obtain a connection may fail.  A value less than zero will bypass any initial
connection attempt, and the pool will start immediately while trying to obtain connections
in the background.  Consequently, later efforts to obtain a connection may fail.
*Default: 1*

&#10062;``isolateInternalQueries``<br/>
This property determines whether HikariCP isolates internal pool queries, such as the
connection alive test, in their own transaction.  Since these are typically read-only
queries, it is rarely necessary to encapsulate them in their own transaction.  This
property only applies if ``autoCommit`` is disabled.
*Default: false*

&#10062;``allowPoolSuspension``<br/>
This property controls whether the pool can be suspended and resumed through JMX.  This is
useful for certain failover automation scenarios.  When the pool is suspended, calls to
``getConnection()`` will *not* timeout and will be held until the pool is resumed.
*Default: false*

&#10062;``readOnly``<br/>
This property controls whether *Connections* obtained from the pool are in read-only mode by
default.  Note some databases do not support the concept of read-only mode, while others provide
query optimizations when the *Connection* is set to read-only.  Whether you need this property
or not will depend largely on your application and database.
*Default: false*

&#10062;``registerMbeans``<br/>
This property controls whether or not JMX Management Beans ("MBeans") are registered or not.
*Default: false*

&#128292;``catalog``<br/>
This property sets the default *catalog* for databases that support the concept of catalogs.
If this property is not specified, the default catalog defined by the JDBC driver is used.
*Default: driver default*

&#128292;``connectionInitSql``<br/>
This property sets a SQL statement that will be executed after every new connection creation
before adding it to the pool. If this SQL is not valid or throws an exception, it will be
treated as a connection failure and the standard retry logic will be followed.
*Default: none*

&#128292;``driverClassName``<br/>
HikariCP will attempt to resolve a driver through the DriverManager based solely on the ``jdbcUrl``,
but for some older drivers the ``driverClassName`` must also be specified.  Omit this property unless
you get an obvious error message indicating that the driver was not found.
*Default: none*

&#128292;``transactionIsolation``<br/>
This property controls the default transaction isolation level of connections returned from
the pool.  If this property is not specified, the default transaction isolation level defined
by the JDBC driver is used.  Only use this property if you have specific isolation requirements that are
common for all queries.  The value of this property is the constant name from the ``Connection``
class such as ``TRANSACTION_READ_COMMITTED``, ``TRANSACTION_REPEATABLE_READ``, etc.
*Default: driver default*

&#9203;``validationTimeout``<br/>
This property controls the maximum amount of time that a connection will be tested for aliveness.
This value must be less than the ``connectionTimeout``.  Lowest acceptable validation timeout is 250 ms.
*Default: 5000*

&#9203;``leakDetectionThreshold``<br/>
This property controls the amount of time that a connection can be out of the pool before a
message is logged indicating a possible connection leak.  A value of 0 means leak detection
is disabled.  Lowest acceptable value for enabling leak detection is 2000 (2 seconds).
*Default: 0*

&#10145;``dataSource``<br/>
This property is only available via programmatic configuration or IoC container. This property
allows you to directly set the instance of the ``DataSource`` to be wrapped by the pool, rather than
having HikariCP construct it via reflection.  This can be useful in some dependency injection
frameworks. When this property is specified, the ``dataSourceClassName`` property and all
DataSource-specific properties will be ignored.
*Default: none*

&#128292;``schema``<br/>
This property sets the default *schema* for databases that support the concept of schemas.
If this property is not specified, the default schema defined by the JDBC driver is used.
*Default: driver default*

&#10145;``threadFactory``<br/>
This property is only available via programmatic configuration or IoC container. This property
allows you to set the instance of the ``java.util.concurrent.ThreadFactory`` that will be used
for creating all threads used by the pool. It is needed in some restricted execution environments
where threads can only be created through a ``ThreadFactory`` provided by the application container.
*Default: none*

&#10145;``scheduledExecutor``<br/>
This property is only available via programmatic configuration or IoC container. This property
allows you to set the instance of the ``java.util.concurrent.ScheduledExecutorService`` that will
be used for various internally scheduled tasks.  If supplying HikariCP with a ``ScheduledThreadPoolExecutor``
instance, it is recommended that ``setRemoveOnCancelPolicy(true)`` is used.
*Default: none*

&#10145;``exceptionOverride``<br/>
This property is only available via programmatic configuration or IoC container. This property
allows you to set an instance of a class, implementing the ``com.zaxxer.hikari.SQLExceptionOverride``
interface, that will be called before a connection is evicted from the pool due to specific exception
conditions. Typically, when a ``SQLException`` is thrown, connections are evicted from the pool when
specific *SQLStates* or *ErrorCodes* are present. The ``adjudicate()`` method will be called on the
``SQLExceptionOverride`` instance, which may return one of: ``Override.CONTINUE_EVICT``.
``Override.DO_NOT_EVICT`` or ``Override.MUST_EVICT``. Except in very specific cases
``Override.CONTINUE_EVICT`` should be returned, allowing the default evict/no-evict logic to execute.
*Default: none*

&#128292;``exceptionOverrideClassName``<br/>
This property allows you to specify the name of a user-supplied class implementing the
``com.zaxxer.hikari.SQLExceptionOverride`` interface. An instance of the class will be instantiated
by the pool to adjudicate connection evictions. See the above property ``exceptionOverride`` for a
full description.
*Default: none*

----------------------------------------------------

#### Missing Knobs

HikariCP has plenty of "knobs" to turn as you can see above, but comparatively less than some other pools.
This is a design philosophy.  The HikariCP design aesthetic is Minimalism.  In keeping with the
*simple is better* or *less is more* design philosophy, some configuration axis are intentionally left out.

#### Statement Cache

Many connection pools, including Apache DBCP, Vibur, c3p0 and others offer ``PreparedStatement`` caching.
HikariCP does not.  Why?

At the connection pool layer ``PreparedStatements`` can only be cached *per connection*.  If your application
has 250 commonly executed queries and a pool of 20 connections you are asking your database to hold on to
5000 query execution plans -- and similarly the pool must cache this many ``PreparedStatements`` and their
related graph of objects.

Most major database JDBC drivers already have a Statement cache that can be configured, including PostgreSQL,
Oracle, Derby, MySQL, DB2, and many others.  JDBC drivers are in a unique position to exploit database specific
features, and nearly all of the caching implementations are capable of sharing execution plans *across connections*.
This means that instead of 5000 statements in memory and associated execution plans, your 250 commonly executed
queries result in exactly 250 execution plans in the database.  Clever implementations do not even retain
``PreparedStatement`` objects in memory at the driver-level but instead merely attach new instances to existing plan IDs.

Using a statement cache at the pooling layer is an [anti-pattern](https://en.wikipedia.org/wiki/Anti-pattern),
and will negatively impact your application performance compared to driver-provided caches.

#### Log Statement Text / Slow Query Logging

Like Statement caching, most major database vendors support statement logging through
properties of their own driver.  This includes Oracle, MySQL, Derby, MSSQL, and others.  Some
even support slow query logging.  For those few databases that do not support it, several options are available.
We have received [a report that p6spy works well](https://github.com/brettwooldridge/HikariCP/issues/57#issuecomment-354647631),
and also note the availability of [log4jdbc](https://github.com/arthurblake/log4jdbc) and [jdbcdslog-exp](https://code.google.com/p/jdbcdslog-exp/).

#### Rapid Recovery
Please read the [Rapid Recovery Guide](https://github.com/brettwooldridge/HikariCP/wiki/Rapid-Recovery) for details on how to configure your driver and system for proper recovery from database restart and network partition events.

----------------------------------------------------

### :see_no_evil: Secret Properties

HikariCP has several Java system properties that control various aspects of the pool. These properties are *unsupported*
for user manipulation. It is possible though unlikely that they may not exist in the future. This means: do not open an issue of any kind if you have modified these properties. *Pretend you never heard anything about "secret properties".*

| Property                                      | Description                                                                                                                                                                                                                                       |
|:----------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ``com.zaxxer.hikari.blockUntilFilled``        | When this property is set ``true`` *and* ``initializationFailTimeout`` is greater than 1, the pool will block during start until completely filled.                                                                                               |
| ``com.zaxxer.hikari.enableRequestBoundaries`` | When this property is set ``true``, HikariCP will bracket connection acquisition and return with calls to ``Connection.beginRequest()`` and ``Connection.endRequest()``.                                                                          |
| ``com.zaxxer.hikari.housekeeping.period``     | This property controls the frequency of the housekeeping thread, represented in milliseconds. Really, don't mess with this.                                                                                                                       |
| ``com.zaxxer.hikari.legacy.supportUserPassDataSourceOverride`` | When this property is set ``true``, HikariCP will support the legacy behavior of overriding the ``getUsername()/getPassword()`` methods on *HikariDataSource*. Preferred method is overriding ``getCredentials()``.             |
| ``com.zaxxer.hikari.useWeakReferences``       | When this property is set ``true`` it will force HikariCP to use ``WeakReference`` objects in the ``ConcurrentBag`` internal collection ThreadLocals and prevent the use of our ``FastList`` class, all to avoid TomCat warnings during redeploy. |

Either don't use these properties or take on full responsibility for the consequences.

### :rocket: Initialization

You can use the ``HikariConfig`` class like so<sup>1</sup>:
```java
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

HikariDataSource ds = new HikariDataSource(config);
```
&nbsp;<sup><sup>1</sup> MySQL-specific example, DO NOT COPY VERBATIM.</sup>

or directly instantiate a ``HikariDataSource`` like so:
```java
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
ds.setUsername("bart");
ds.setPassword("51mp50n");
...
```
or property file based:
```java
// Examines both filesystem and classpath for .properties file
HikariConfig config = new HikariConfig("/some/path/hikari.properties");
HikariDataSource ds = new HikariDataSource(config);
```
Example property file:
```ini
dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost
```
or ``java.util.Properties`` based:
```java
Properties props = new Properties();
props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource");
props.setProperty("dataSource.user", "test");
props.setProperty("dataSource.password", "test");
props.setProperty("dataSource.databaseName", "mydb");
props.put("dataSource.logWriter", new PrintWriter(System.out));

HikariConfig config = new HikariConfig(props);
HikariDataSource ds = new HikariDataSource(config);
```

There is also a System property available, ``hikaricp.configurationFile``, that can be used to specify the
location of a properties file.  If you intend to use this option, construct a ``HikariConfig`` or ``HikariDataSource``
instance using the default constructor and the properties file will be loaded.

### Performance Tips
[MySQL Performance Tips](https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration)

### Popular DataSource Class Names

We recommended using ``dataSourceClassName`` instead of ``jdbcUrl``, but either is acceptable.  We'll say that again, *either is acceptable*.

&#9888;&nbsp;*Note: Spring Boot auto-configuration users, you need to use ``jdbcUrl``-based configuration.*

&#9888;&nbsp;The MySQL DataSource is known to be broken with respect to network timeout support. Use ``jdbcUrl`` configuration instead.

Here is a list of JDBC *DataSource* classes for popular databases:

| Database         | Driver       | *DataSource* class |
|:---------------- |:------------ |:-------------------|
| Apache Derby     | Derby        | org.apache.derby.jdbc.ClientDataSource |
| Firebird         | Jaybird      | org.firebirdsql.ds.FBSimpleDataSource |
| Google Spanner   | Spanner      | com.google.cloud.spanner.jdbc.JdbcDriver |
| H2               | H2           | org.h2.jdbcx.JdbcDataSource |
| HSQLDB           | HSQLDB       | org.hsqldb.jdbc.JDBCDataSource |
| IBM DB2          | IBM JCC      | com.ibm.db2.jcc.DB2SimpleDataSource |
| IBM Informix     | IBM Informix | com.informix.jdbcx.IfxDataSource |
| MS SQL Server    | Microsoft    | com.microsoft.sqlserver.jdbc.SQLServerDataSource |
| ~~MySQL~~        | Connector/J  | ~~com.mysql.jdbc.jdbc2.optional.MysqlDataSource~~ |
| MariaDB          | MariaDB      | org.mariadb.jdbc.MariaDbDataSource |
| Oracle           | Oracle       | oracle.jdbc.pool.OracleDataSource |
| OrientDB         | OrientDB     | com.orientechnologies.orient.jdbc.OrientDataSource |
| PostgreSQL       | pgjdbc-ng    | com.impossibl.postgres.jdbc.PGDataSource |
| PostgreSQL       | PostgreSQL   | org.postgresql.ds.PGSimpleDataSource |
| SAP MaxDB        | SAP          | com.sap.dbtech.jdbc.DriverSapDB |
| SQLite           | xerial       | org.sqlite.SQLiteDataSource |
| SyBase           | jConnect     | com.sybase.jdbc4.jdbc.SybDataSource |

### Play Framework Plugin

Note Play 2.4 now uses HikariCP by default.  A new plugin has come up for the the Play framework; [play-hikaricp](http://edulify.github.io/play-hikaricp.edulify.com/).  If you're using the excellent Play framework,  your application deserves HikariCP.  Thanks Edulify Team!

### Clojure Wrapper

A new Clojure wrapper has been created by [tomekw](https://github.com/tomekw) and can be [found here](https://github.com/tomekw/hikari-cp).

### JRuby Wrapper

A new JRuby wrapper has been created by [tomekw](https://github.com/tomekw) and can be [found here](https://github.com/tomekw/hucpa).

----------------------------------------------------

### Wiki

Don't forget the [Wiki](https://github.com/brettwooldridge/HikariCP/wiki) for additional information such as:
 * [FAQ](https://github.com/brettwooldridge/HikariCP/wiki/FAQ)
 * [Hibernate 4.x Configuration](https://github.com/brettwooldridge/HikariCP/wiki/Hibernate4)
 * [MySQL Configuration Tips](https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration)
 * etc.

----------------------------------------------------

### Requirements

 &#8658; Java 11+ (Java 6/7/8 artifacts are in maintenance mode)<br/>
 &#8658; slf4j library<br/>

### Sponsors
High-performance projects can never have too many tools!  We would like to thank the following companies:

Thanks to [ej-technologies](https://www.ej-technologies.com) for their excellent all-in-one profiler, [JProfiler](https://www.ej-technologies.com/products/jprofiler/overview.html).

YourKit supports open source projects with its full-featured Java Profiler.  Click the YourKit logo below to learn more.<br/>
[![](https://github.com/brettwooldridge/HikariCP/wiki/yklogo.png)](http://www.yourkit.com/java/profiler/index.jsp)<br/>


### Contributions

Please perform changes and submit pull requests from the ``dev`` branch instead of ``master``.  Please set your editor to use spaces instead of tabs, and adhere to the apparent style of the code you are editing.  The ``dev`` branch is always more "current" than the ``master`` if you are looking to live life on the edge.

[Build Status]:https://circleci.com/gh/brettwooldridge/HikariCP
[Build Status img]:https://circleci.com/gh/brettwooldridge/HikariCP/tree/dev.svg?style=shield

[Coverage Status]:https://codecov.io/gh/brettwooldridge/HikariCP
[Coverage Status img]:https://codecov.io/gh/brettwooldridge/HikariCP/branch/dev/graph/badge.svg

[license]:LICENSE
[license img]:https://img.shields.io/badge/license-Apache%202-blue.svg

[Javadocs]:http://javadoc.io/doc/com.zaxxer/HikariCP
[Javadocs img]:http://javadoc.io/badge/com.zaxxer/HikariCP.svg

[Librapay]:https://liberapay.com/brettwooldridge
[Librapay img]:https://img.shields.io/liberapay/patrons/brettwooldridge.svg?logo=liberapay


================================================
FILE: codecov.yml
================================================
codecov:
  notify:
    require_ci_to_pass: yes

coverage:
  precision: 2
  round: down
  range: "50..80"

  status:
    project: yes
    patch: yes
    changes: no

parsers:
  gcov:
    branch_detection:
      conditional: yes
      loop: yes
      method: no
      macro: no

comment:
  layout: "reach, diff, flags, files, footer"
  behavior: default
  require_changes: no



================================================
FILE: documents/Wall-of-Fame.md
================================================
<img width="260" valign="middle" src="http://d26gg7w375vuv5.cloudfront.net/Design+Assets/black+Wix+Logo+Assets/Black+Wix+logo+Assets.png">![][spacer]<img width="250" height="88" valign="middle" src="https://www.skytap.com/wp-content/uploads/2016/05/Puppets_company_logo.png">![][spacer]<img width="250" height="88" valign="middle" src="https://web.liferay.com/osb-community-theme/images/custom/heading.png">

<img width="240" valign="middle" src="https://www.playframework.com/assets/images/logos/play_full_color.png">![][spacer]<img width="240" valign="middle" src="https://www.atlassian.com/dam/jcr:416a5a7b-55dc-435d-a3e3-22aa2650ba5d/AtlassianLogo.svg">![][spacer]<img width="240" valign="middle" src="https://www.saydaily.com/.image/c_limit%2Ccs_srgb%2Cq_auto:good%2Cw_410/MTM0ODg3OTkwOTMyNTc1NTA2/screen-shot-2015-12-03-at-22820-pmpng.png">

<img width="240" valign="middle" src="https://upload.wikimedia.org/wikipedia/commons/e/e8/Splunk-Logo.jpg">![][spacer]<img width="240" valign="middle" src="https://www.surpasshosting.com/images/comodo_logo.png">![][spacer]<img width="240" valign="middle" src="https://www.ca.com/content/dam/ca/us/images/company/ca-logo-b-w.jpg">

<img width="260" valign="middle" src="http://fiware-cosmos.readthedocs.io/en/r4_fiware/user_and_programmer_manual/streaming/images/storm_logo.png">![][spacer]<img width="240" valign="middle" src="https://image.slidesharecdn.com/apachehive-151229131013/95/apache-hive-1-638.jpg?cb=1451394627">![][spacer]<img width="240" valign="middle" src="http://design.jboss.org/hibernate/logo/final/hibernate_logo_whitebkg.svg">

<img width="240" valign="middle" src="https://spring.io/img/spring-by-pivotal.png">![][spacer]<img width="240" valign="middle" src="https://jaxenter.com/wp-content/uploads/2013/02/slick.jpg">![][spacer]<img width="240" valign="middle" src="https://www.opennms.com/wp-content/uploads/2015/02/openNMSlogo-transparent-noninterlaced-150ppi.png">

<img width="240" valign="middle" src="https://aries.apache.org/images/Arieslogo_Horizontal.gif">


<img height="60" src="https://github.com/brettwooldridge/HikariCP/wiki/space60x1.gif"/>

-------------------------------------------------------------------------------------
 * Images on this page are Trademarked and Copyrighted by their respective rights holders.
 * Images on this page are used without express permission, and do not constitute an endorsement of HikariCP. If you are a trademark or copyright holder and wish an image to be removed from this page, please open a request in the issue tracker.

[spacer]: https://github.com/brettwooldridge/HikariCP/wiki/space60x1.gif


================================================
FILE: documents/Welcome-To-The-Jungle.md
================================================
<img width="340" height="240" align="left" src="https://github.com/brettwooldridge/HikariCP/wiki/welcome-to-the-jungle.jpg">
Microbenchmarks are great at measuring performance "in the small"; for example, measuring the performance of individual methods. But good results do not necessarily translate into macro-scale performance.  Real world access patterns and demand loads often run into deeper, systemic, architectural design issues that cannot be discerned at the micro level.<br><br>

HikariCP has over 1 million users, so from time to time we are approached with challenges encountered "in the wild".  Recently, one such challenge led to a deeper investigation: ***Spike Demand***.

### The Challenge
The user has an environment where connection creation is expensive, on the order of 150ms; and yet queries typically execute in ~2ms.  Long connection setup times can be the result of various factors, alone or in combination: DNS resolution times, encrypted connections with strong encryption (2048/4096 bit), external authentication, database server load, etc.

*Generally speaking, for the best performance in response to spike demands, HikariCP recommends a fixed-size pool.*

Unfortunately, the user's application is also in an environment where many other applications are connected to the same database, and therefore dynamically-sized pools are desirable -- where idle applications are allowed to give up some of their connections.  The user is running the application with HikariCP configured as ``minimumIdle=5``.

In this environment, the application has periods of quiet, as well as sudden spikes of requests, and periods of sustained activity.  The combination of high connection setup times, a dynamically-sized pool requirement, and spike demands is just about the worst case scenario for a connection pool.

The questions ultimately were these:

> * If the pool is sitting idle with 5 connections, and is suddenly hit with 50 requests, what should happen?
> * Given that a each new connection is going to take 150ms to establish, and given that each request can ultimately be satisfied in ~2ms, shouldn't even a single one of the idle connections be able to handle all the of the requests in ~100ms anyway?
> * So, why is the pool size growing [so much]?

We thought these were interesting questions, and HikariCP was indeed creating more connections than we expected...

### 3, 2, 1 ... Go!
In order to explore these questions, we built a simulation and started measuring.  The simulation harness [code is here](https://github.com/brettwooldridge/HikariCP-benchmark/blob/master/src/test/java/com/zaxxer/hikari/benchmark/SpikeLoadTest.java).

The constraints are simple:
 * Connection establishment takes 150ms.
 * Query execution takes 2ms.
 * The maximum pool size is 50.
 * The minimum idle connections is 5.

And the simulation is fairly simple:
 * Everything is quiet, and then ... Boom! ... 50 threads, at once, wanting a connection and to execute a query.
 * Take measurements every 250μs (microseconds).

### Results
After running HikariCP through the simulation, tweaking the code (ultimately a one-line change), and satisfying ourselves that the behavior is as we would wish, we ran a few other pools through the simulation.

The code was run as follows:
```
bash$ ./spiketest.sh 150 <pool> 50
```
Where ``150`` is the connection establishment time, ``<pool>`` is one of [*hikari*, *dbcp2*, *vibur*, *tomcat*, *c3p0*], and ``50`` is the number of threads/requests.  Note that *c3p0* was dropped from the analysis here, as its run time was ~120x that of HikariCP.

#### HikariCP (v2.6.0) <sub><sup><a href="https://github.com/brettwooldridge/HikariCP/wiki/Spike-Hikari-data.txt">raw data</a></sup></sub>

--------------------
[![](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Hikari.png)](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Hikari.png)

#### Apache DBCP (v2.1.1) <sub><sup><a href="https://github.com/brettwooldridge/HikariCP/wiki/Spike-DBCP2-data.txt">raw data</a></sup></sub>

--------------------
[![](https://github.com/brettwooldridge/HikariCP/wiki/Spike-DBCP2.png)](https://github.com/brettwooldridge/HikariCP/wiki/Spike-DBCP2.png)

#### Apache Tomcat (v8.0.24) <sub><sup><a href="https://github.com/brettwooldridge/HikariCP/wiki/Spike-Tomcat-data.txt">raw data</a></sup></sub>

--------------------
[![](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Tomcat.png)](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Tomcat.png)

#### Vibur DBCP (v16.1) <sub><sup><a href="https://github.com/brettwooldridge/HikariCP/wiki/Spike-Vibur-data.txt">raw data</a></sup></sub>

--------------------
[![](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Vibur.png)](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Vibur.png)

<sup>* Note that the times provided in the raw data is the number of microseconds (μs) since the start of the test. For graphing purposes, raw data for each pool was trimmed such that the first entry has 0 requests enqueued, and the last entry has all connections completed. </sup>

--------------------
### Apache DBCP vs HikariCP
:point_right: In case you missed the *time-scale* in the graphs above, here is a properly scaled comparable.

Apache DBCP on *top*, HikariCP on the *bottom*.

[![](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Compare.png)](https://github.com/brettwooldridge/HikariCP/wiki/Spike-Compare.png)

### Commentary
We'll start by saying that we are not going to comment on the implementation specifics of the other pools, but you may be able to draw inferences by our comments regarding HikariCP.

Looking at the HikariCP graph, we couldn't have wished for a better profile; it's about as close to perfect efficiency as we could expect.  It is interesting, though not surprising, that the other pool profiles are so similar to each other. Even though arrived at via different implementations, they are the result of a *conventional* or *obvious* approach to pool design.

HikariCP's profile in this case, and the reason for the difference observed between other pools, is the result of our Prime Directive:

💡 **User threads should only ever block on the** ***pool itself***.<sup>1</sup><br>
<img width="32px" src="https://github.com/brettwooldridge/HikariCP/wiki/space60x1.gif"><sub><sup>1</sup>&nbsp;to the greatest extent possible.</sub>

Consider this hypothetical scenario:
```
There is a pool with five connections in-use, and zero idle (available) connections. Then, a new thread
comes in requesting a connection.
```
"How does the prime directive apply in this case?"  We'll answer with a question of our own:

> If the thread is directed to create a new connection, and that connection takes 150ms to establish, what happens if one of the five in-use connections is returned to the pool?

---------------------
Both Apache DBCP2 and Vibur ended the run with 45 connections, Apache Tomcat (inexplicably) with 40 connections, while HikariCP ended the run with 5 (technically six, see below).  This has major and measurable effects for real world deployments.  That is 35-40 additional connections that are not available to other applications, and 35-40 additional threads and associated memory structures in the database.

We know what you are thinking, *"What if the load had been sustained?"*&nbsp;&nbsp;The answer is: HikariCP also would have ramped up.

In point of fact, as soon as the pool hit zero available connections, right around 800μs into the run, HikariCP began requesting connections to be added to the pool asynchronously.  If the metrics had continued to be collected past the end of the spike -- out beyond 150ms -- you would observe that an additional connection is indeed added to the pool.  But *only one*, because HikariCP employs *elision logic*; at that point HikariCP would also realize that there is actually no more pending demand, and the remaining connection acquisitions would be elided.

### Epilog
This scenario represents only *one* of many access patterns. HikariCP will continue to research *and innovate* when presented with challenging problems encountered in real world deployments.  As always, thank you for your patronage.


================================================
FILE: install-jdk.sh
================================================
#!/usr/bin/env bash

#
# Install JDK for Linux and Mac OS
#
# This script determines the most recent early-access build number,
# downloads the JDK archive to the user home directory and extracts
# it there.
#
# Exported environment variables (when sourcing this script)
#
#   JAVA_HOME is set to the extracted JDK directory
#   PATH is prepended with ${JAVA_HOME}/bin
#
# (C) 2020 Christian Stein
#
# https://github.com/sormuras/bach/blob/master/install-jdk.sh
#

set -o errexit
#set -o nounset # https://github.com/travis-ci/travis-ci/issues/5434
#set -o xtrace

function initialize() {
    readonly script_name="$(basename "${BASH_SOURCE[0]}")"
    readonly script_version='2020-03-17'

    dry=false
    silent=false
    verbose=false
    emit_java_home=false

    feature='ea'
    license='GPL' # Force GPLv2+CE
    os='?'
    url='?'
    workspace="${HOME}"
    target='?'
    cacerts=false
}

function usage() {
cat << EOF
Usage: ${script_name} [OPTION]...
Download and extract latest-and-greatest JDK from https://jdk.java.net

Version: ${script_version}
Options:
  -h|--help                 Displays this help
  -d|--dry-run              Activates dry-run mode
  -s|--silent               Displays no output
  -e|--emit-java-home       Print value of "JAVA_HOME" to stdout (ignores silent mode)
  -v|--verbose              Displays verbose output

  -f|--feature 11|12|...|ea JDK feature release number, defaults to "ea"
  -o|--os linux-x64|osx-x64 Operating system identifier
  -u|--url "https://..."    Use custom JDK archive (provided as .tar.gz file)
  -w|--workspace PATH       Working directory defaults to \${HOME} [${HOME}]
  -t|--target PATH          Target directory, defaults to first component of the tarball
  -c|--cacerts              Link system CA certificates (currently only Debian/Ubuntu is supported)
EOF
}

function script_exit() {
    if [[ $# -eq 1 ]]; then
        printf '%s\n' "$1"
        exit 0
    fi

    if [[ $# -eq 2 && $2 =~ ^[0-9]+$ ]]; then
        printf '%b\n' "$1"
        exit "$2"
    fi

    script_exit 'Invalid arguments passed to script_exit()!' 2
}

function say() {
    if [[ ${silent} != true ]]; then
        echo "$@"
    fi
}

function verbose() {
    if [[ ${verbose} == true ]]; then
        echo "$@"
    fi
}

function parse_options() {
    local option
    while [[ $# -gt 0 ]]; do
        option="$1"
        shift
        case ${option} in
            -h|-H|--help)
                usage
                exit 0
                ;;
            -v|-V|--verbose)
                verbose=true
                ;;
            -s|-S|--silent)
                silent=true
                verbose "Silent mode activated"
                ;;
            -d|-D|--dry-run)
                dry=true
                verbose "Dry-run mode activated"
                ;;
            -e|-E|--emit-java-home)
                emit_java_home=true
                verbose "Emitting JAVA_HOME"
                ;;
            -f|-F|--feature)
                feature="$1"
                verbose "feature=${feature}"
                shift
                ;;
            -l|-L|--license)
                # license="$1"
                say "Ignoring license option: $1 -- using GPLv2+CE by default"
                verbose "license=${license}"
                shift
                ;;
            -o|-O|--os)
                os="$1"
                verbose "os=${os}"
                shift
                ;;
            -u|-U|--url)
                url="$1"
                verbose "url=${url}"
                shift
                ;;
            -w|-W|--workspace)
                workspace="$1"
                verbose "workspace=${workspace}"
                shift
                ;;
            -t|-T|--target)
                target="$1"
                verbose "target=${target}"
                shift
                ;;
            -c|-C|--cacerts)
                cacerts=true
                verbose "Linking system CA certificates"
                ;;
            *)
                script_exit "Invalid argument was provided: ${option}" 2
                ;;
        esac
    done
}

function determine_latest_jdk() {
    local number
    local curl_result
    local url

    number=15
    verbose "Determine latest JDK feature release number, starting with ${number}"
    while [[ ${number} != 99 ]]
    do
      url="https://jdk.java.net/${number}"
      curl_result=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url})
      if [[ ${curl_result} -ge 400 ]]; then
        break
      fi
      verbose "  Found ${url} [${curl_result}]"
      latest_jdk=${number}
      number=$[$number +1]
    done

    verbose "Latest JDK feature release number is: ${latest_jdk}"
}

function perform_sanity_checks() {
    if [[ ${feature} == '?' ]] || [[ ${feature} == 'ea' ]]; then
        feature=${latest_jdk}
    fi
    if [[ ${feature} -lt 9 ]] || [[ ${feature} -gt ${latest_jdk} ]]; then
        script_exit "Expected feature release number in range of 9 to ${latest_jdk}, but got: ${feature}" 3
    fi
    if [[ -d "$target" ]]; then
        script_exit "Target directory must not exist, but it does: $(du -hs '${target}')" 3
    fi
}

function determine_url() {
    local JAVA_NET="https://jdk.java.net/${feature}"
    local DOWNLOAD='https://download.java.net/java'

    # An official GA build or an archived feature? Use predefined URL
    case "${feature}" in
        9) url="${DOWNLOAD}/GA/jdk9/9.0.4/binaries/openjdk-9.0.4_${os}_bin.tar.gz"; return;;
       10) url="${DOWNLOAD}/GA/jdk10/10.0.2/19aef61b38124481863b1413dce1855f/13/openjdk-10.0.2_${os}_bin.tar.gz"; return;;
       11) url="${DOWNLOAD}/GA/jdk11/9/GPL/openjdk-11.0.2_${os}_bin.tar.gz"; return;;
       12) url="${DOWNLOAD}/GA/jdk12.0.2/e482c34c86bd4bf8b56c0b35558996b9/10/GPL/openjdk-12.0.2_${os}_bin.tar.gz"; return;;
       13) url="${DOWNLOAD}/GA/jdk13.0.2/d4173c853231432d94f001e99d882ca7/8/GPL/openjdk-13.0.2_${os}_bin.tar.gz"; return;;
       14) url="${DOWNLOAD}/GA/jdk14/076bab302c7b4508975440c56f6cc26a/36/GPL/openjdk-14_${os}_bin.tar.gz"; return;;
    #  15) is still available from its EA/RC location determined below
    esac

    # EA or RC build? Grab URL from HTML source of jdk.java.net/${feature}
    local candidates=$(wget --quiet --output-document - ${JAVA_NET} | grep -Eo 'href[[:space:]]*=[[:space:]]*"[^\"]+"' | grep -Eo '(http|https)://[^"]+')
    url=$(echo "${candidates}" | grep -Eo "${DOWNLOAD}/.+/jdk${feature}/.*${license}/.*jdk-${feature}.+${os}_bin(.tar.gz|.zip)$" || true)

    if [[ -z ${url} ]]; then
        script_exit "Couldn't determine a download url for ${feature}-${license} on ${os}" 1
    fi
}

function prepare_variables() {
    if [[ ${os} == '?' ]]; then
        if [[ "$OSTYPE" == "darwin"* ]]; then
          os='osx-x64'
        else
          os='linux-x64'
        fi
    fi
    if [[ ${url} == '?' ]]; then
        determine_latest_jdk
        perform_sanity_checks
        determine_url
    else
        feature='<overridden by custom url>'
        license='<overridden by custom url>'
        os='<overridden by custom url>'
    fi
    status=$(curl -o /dev/null --silent --head --write-out %{http_code} ${url})
}

function print_variables() {
cat << EOF
Variables:
  feature = ${feature}
       os = ${os}
      url = ${url}
   status = ${status}
EOF
}

function download_and_extract_and_set_target() {
    local quiet='--quiet'; if [[ ${verbose} == true ]]; then quiet=''; fi
    local local="--directory-prefix ${workspace} --output-document=jdk.tar.gz"
    local remote='--timestamping --continue'
    local wget_options="${quiet} ${local} ${remote}"
    local tar_options="--file jdk.tar.gz"

    say "Downloading JDK from ${url}..."
    verbose "Using wget options: ${wget_options}"
    wget ${wget_options} ${url}

    if [[ ${os} == 'windows-x64' ]]; then
        script_exit "Extracting archives on Windows isn't supported, yet" 4
    fi

    verbose "Using tar options: ${tar_options}"
    if [[ ${target} == '?' ]]; then
        tar --extract ${tar_options} -C "${workspace}"
        if [[ "$OSTYPE" != "darwin"* ]]; then
            target="${workspace}"/$(tar --list ${tar_options} | grep 'bin/javac' | tr '/' '\n' | tail -3 | head -1)
        else
            target="${workspace}"/$(tar --list ${tar_options} | head -2 | tail -1 | cut -f 2 -d '/' -)/Contents/Home
        fi
        verbose "Set target to: ${target}"
    else
        echo "Using custom target: ${target}"
        if [[ "$OSTYPE" != "darwin"* ]]; then
            mkdir --parents "${target}"
            tar --extract ${tar_options} -C "${target}" --strip-components=1
        else
            mkdir -p "${target}"
            tar --extract ${tar_options} -C "${target}" --strip-components=4
        fi
    fi

    if [[ ${verbose} == true ]]; then
        echo "Content of target directory:"
        ls "${target}"
        echo "Content of release file:"
        [[ ! -f "${target}/release" ]] || cat "${target}/release"
    fi

    # Link to system certificates
    # https://openjdk.java.net/jeps/319
    # https://bugs.openjdk.java.net/browse/JDK-8196141
    if [[ ${cacerts} == true ]]; then
        local directory="${target}/lib/security/cacerts"
        if [[ -f "${directory}" ]]; then
            mv "${directory}" "${directory}.jdk"
            ln -s /etc/ssl/certs/java/cacerts "${directory}"
        else
            verbose "Directory ${directory} doesn't exist, didn't link system CA certificates."
        fi
    fi
}

function main() {
    initialize
    parse_options "$@"

    say "$script_name $script_version"
    prepare_variables

    if [[ ${silent} == false ]]; then print_variables; fi
    if [[ ${dry} == true ]]; then exit 0; fi

    download_and_extract_and_set_target

    export JAVA_HOME=$(cd "${target}"; pwd)
    export PATH=${JAVA_HOME}/bin:$PATH

    if [[ ${silent} == false ]]; then java -Xmx100m -version; fi
    if [[ ${emit_java_home} == true ]]; then echo "${JAVA_HOME}"; fi
}

main "$@"


================================================
FILE: osx-toolchains.xml
================================================
<?xml version="1.0" encoding="UTF8"?>
<toolchains>
   <toolchain>
      <type>paths</type>
      <provides>
         <id>java</id>
      </provides>
      <configuration>
         <paths>
            <path>/Library/Java/JavaVirtualMachines/jdk-11.0.11.jdk/Contents/Home/bin</path>
         </paths>
      </configuration>
   </toolchain>
</toolchains>


================================================
FILE: pom.xml
================================================
<!--
   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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <sureFireOptions11>--add-modules=ALL-MODULE-PATH</sureFireOptions11>
      <sureFireForks11>false</sureFireForks11>
      <!--java11.sourceDirectory>${project.basedir}/src/main/java11</java11.sourceDirectory -->
      <!--java11.build.outputDirectory>${project.build.directory}/classes-java11</java11.build.outputDirectory -->
      <artifact.classifier />

      <!-- When releasing a new version, this property controls whether the staged artifacts will be automatically
           released in Nexus. If this is set to false (-DautoReleaseStagedArtifacts=false), artifacts will need to
           be manually released via the Nexus UI at https://oss.sonatype.org -->
      <autoReleaseStagedArtifacts>true</autoReleaseStagedArtifacts>

      <commons.csv.version>1.12.0</commons.csv.version>
      <docker.maven.plugin.fabric8.version>0.45.0</docker.maven.plugin.fabric8.version>
      <felix.bundle.plugin.version>5.1.9</felix.bundle.plugin.version>
      <felix.version>7.0.5</felix.version>
      <h2.version>2.3.232</h2.version>
      <hibernate.version>5.4.24.Final</hibernate.version>
      <javassist.version>3.29.2-GA</javassist.version>
      <jndi.version>0.11.4.1</jndi.version>
      <junit.version>4.13.2</junit.version>
      <log4j.version>2.25.1</log4j.version>
      <maven.release.version>3.0.1</maven.release.version>
      <metrics.version>3.2.5</metrics.version>
      <metrics5.version>5.0.0-rc17</metrics5.version>
      <micrometer.version>1.5.4</micrometer.version>
      <mockito.version>3.7.7</mockito.version>
      <pax.exam.version>4.14.0</pax.exam.version>
      <pax.url.version>2.5.4</pax.url.version>
      <postgresql.version>42.7.7</postgresql.version>
      <simpleclient.version>0.16.0</simpleclient.version>
      <slf4j.version>2.0.17</slf4j.version>
      <testcontainers.version>1.20.3</testcontainers.version>
   </properties>

   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>7.0.3-SNAPSHOT</version>
   <packaging>bundle</packaging>

   <name>HikariCP</name>
   <description>Ultimate JDBC Connection Pool</description>
   <url>https://github.com/brettwooldridge/HikariCP</url>
   <inceptionYear>2013</inceptionYear>

   <organization>
      <name>Zaxxer.com</name>
      <url>https://github.com/brettwooldridge</url>
   </organization>

   <scm>
      <connection>scm:git:https://github.com/brettwooldridge/HikariCP.git</connection>
      <developerConnection>scm:git:https://github.com/brettwooldridge/HikariCP.git</developerConnection>
      <url>https://github.com/brettwooldridge/HikariCP</url>
      <tag>HEAD</tag>
   </scm>

   <distributionManagement>
      <snapshotRepository>
         <id>ossrh</id>
         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
      </snapshotRepository>
   </distributionManagement>

   <issueManagement>
      <url>https://github.com/brettwooldridge/HikariCP/issues</url>
   </issueManagement>

   <licenses>
      <license>
         <name>The Apache Software License, Version 2.0</name>
         <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
         <distribution>repo</distribution>
      </license>
   </licenses>

   <developers>
      <developer>
         <name>Brett Wooldridge</name>
         <email>brett.wooldridge@gmail.com</email>
      </developer>
   </developers>

   <dependencies>
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>${slf4j.version}</version>
      </dependency>
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-api</artifactId>
         <version>${log4j.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-core</artifactId>
         <version>${log4j.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.testcontainers</groupId>
         <artifactId>postgresql</artifactId>
         <version>${testcontainers.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-compress</artifactId>
         <version>1.27.1</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-lang3</artifactId>
         <version>3.18.0</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-csv</artifactId>
         <version>${commons.csv.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.mockito</groupId>
         <artifactId>mockito-core</artifactId>
         <version>${mockito.version}</version>
         <scope>test</scope>
         <exclusions>
            <exclusion>
               <groupId>org.hamcrest</groupId>
               <artifactId>hamcrest-core</artifactId>
            </exclusion>
         </exclusions>
      </dependency>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>${junit.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.javassist</groupId>
         <artifactId>javassist</artifactId>
         <version>${javassist.version}</version>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>io.micrometer</groupId>
         <artifactId>micrometer-core</artifactId>
         <version>${micrometer.version}</version>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.postgresql</groupId>
         <artifactId>postgresql</artifactId>
         <version>${postgresql.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-core</artifactId>
         <version>${hibernate.version}</version>
         <scope>provided</scope>
         <optional>true</optional>
         <exclusions>
            <exclusion>
               <artifactId>jboss-logging</artifactId>
               <groupId>org.jboss.logging</groupId>
            </exclusion>
            <exclusion>
               <artifactId>jboss-logging-annotations</artifactId>
               <groupId>org.jboss.logging</groupId>
            </exclusion>
         </exclusions>
      </dependency>
      <dependency>
         <groupId>io.dropwizard.metrics</groupId>
         <artifactId>metrics-core</artifactId>
         <version>${metrics.version}</version>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>io.dropwizard.metrics</groupId>
         <artifactId>metrics-healthchecks</artifactId>
         <version>${metrics.version}</version>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>io.dropwizard.metrics5</groupId>
         <artifactId>metrics-core</artifactId>
         <version>${metrics5.version}</version>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>io.prometheus</groupId>
         <artifactId>simpleclient</artifactId>
         <version>${simpleclient.version}</version>
         <scope>provided</scope>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>simple-jndi</groupId>
         <artifactId>simple-jndi</artifactId>
         <version>${jndi.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-slf4j2-impl</artifactId>
         <version>${log4j.version}</version>
         <scope>test</scope>
      </dependency>

      <!-- OSGi test -->
      <dependency>
         <groupId>javax.inject</groupId>
         <artifactId>javax.inject</artifactId>
         <version>1</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.apache.felix</groupId>
         <artifactId>org.apache.felix.framework</artifactId>
         <version>${felix.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.exam</groupId>
         <artifactId>pax-exam-container-native</artifactId>
         <version>${pax.exam.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.exam</groupId>
         <artifactId>pax-exam-junit4</artifactId>
         <version>${pax.exam.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.exam</groupId>
         <artifactId>pax-exam-link-assembly</artifactId>
         <version>${pax.exam.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.exam</groupId>
         <artifactId>pax-exam-link-mvn</artifactId>
         <version>${pax.exam.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.url</groupId>
         <artifactId>pax-url-aether</artifactId>
         <version>${pax.url.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>org.ops4j.pax.url</groupId>
         <artifactId>pax-url-reference</artifactId>
         <version>${pax.url.version}</version>
         <scope>test</scope>
      </dependency>
      <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
         <version>${h2.version}</version>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <pluginManagement>
         <plugins>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-resources-plugin</artifactId>
               <version>3.3.1</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-install-plugin</artifactId>
               <version>3.1.4</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-clean-plugin</artifactId>
               <version>3.2.0</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.10.1</version>
               <configuration>
                  <source>11</source>
                  <target>11</target>
                  <compilerArgs>-Xlint</compilerArgs>
               </configuration>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-deploy-plugin</artifactId>
               <version>2.8.2</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-gpg-plugin</artifactId>
               <version>3.0.1</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-release-plugin</artifactId>
               <version>2.5.3</version>
            </plugin>

            <plugin>
               <groupId>org.sonatype.plugins</groupId>
               <artifactId>nexus-staging-maven-plugin</artifactId>
               <version>1.6.12</version>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>3.0.0-M8</version>
               <configuration>
                  <!-- Sets the VM argument line used when unit tests are run. -->
                  <argLine>${surefireArgLine} ${sureFireOptions11}</argLine>
                  <reuseForks>${sureFireForks11}</reuseForks>
                  <useModulePath>false</useModulePath>
               </configuration>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-source-plugin</artifactId>
               <version>3.0.1</version>
               <configuration>
                  <!-- outputDirectory>/absolute/path/to/the/output/directory</outputDirectory>
                     <finalName>filename-of-generated-jar-file</finalName -->
                  <attach>true</attach>
               </configuration>
               <executions>
                  <execution>
                     <id>attach-sources</id>
                     <goals>
                        <goal>jar-no-fork</goal>
                     </goals>
                  </execution>
               </executions>
            </plugin>

            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
               <version>3.11.2</version>
               <configuration>
                  <show>public</show>
                  <attach>true</attach>
                  <maxmemory>1024m</maxmemory>
                  <legacyMode>true</legacyMode>
                  <sourceFileExcludes>
                     <sourceFileExclude>**\/module-info.java</sourceFileExclude>
                     <sourceFileExclude>**\/HikariConfigurationUtil.java</sourceFileExclude>
                     <sourceFileExclude>**\/HikariConnectionProvider.java</sourceFileExclude>
                     <sourceFileExclude>**\/Prometheus*Tracker.java</sourceFileExclude>
                     <sourceFileExclude>**\/Micrometer*Tracker.java</sourceFileExclude>
                     <sourceFileExclude>**\/Dropwizard*Tracker.java</sourceFileExclude>
                     <sourceFileExclude>**\/Coda*Tracker.java</sourceFileExclude>
                  </sourceFileExcludes>
                  <disableSourcepathUsage>true</disableSourcepathUsage>
                  <bottom><![CDATA[Copyright © {inceptionYear}–{currentYear} Brett Wooldridge. All rights reserved.]]></bottom>
               </configuration>
               <executions>
                  <execution>
                     <id>attach-javadoc</id>
                     <phase>package</phase>
                     <goals>
                        <goal>jar</goal>
                     </goals>
                  </execution>
               </executions>
            </plugin>
         </plugins>
      </pluginManagement>

      <plugins>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
               <execution>
                  <id>enforce-maven</id>
                  <goals>
                     <goal>enforce</goal>
                  </goals>
                  <configuration>
                     <rules>
                        <requireMavenVersion>
                           <version>(3.0.0,)</version>
                        </requireMavenVersion>
                     </rules>
                  </configuration>
               </execution>
            </executions>
         </plugin>

         <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
               <execution>
                  <phase>generate-sources</phase>
                  <goals>
                     <goal>build-classpath</goal>
                  </goals>
                  <configuration>
                     <outputProperty>maven.compile.classpath</outputProperty>
                  </configuration>
               </execution>
            </executions>
         </plugin>

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
         </plugin>

         <plugin>
            <!-- Generate proxies -->
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.6.0</version>
            <extensions>true</extensions>
            <executions>
               <execution>
                  <phase>compile</phase>
                  <!-- phase>generate-test-sources</phase -->
                  <goals>
                     <goal>exec</goal>
                  </goals>
               </execution>
            </executions>
            <configuration>
               <executable>java</executable>
               <arguments>
                  <argument>-cp</argument>
                  <argument>${project.build.outputDirectory}${path.separator}${maven.compile.classpath}</argument>
                  <argument>com.zaxxer.hikari.util.JavassistProxyFactory</argument>
                  <argument>${project.basedir}</argument>
               </arguments>
            </configuration>
         </plugin>

         <plugin>
            <!-- The Docker Maven plugin is used to create docker image with the fat jar -->
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>${docker.maven.plugin.fabric8.version}</version>
            <configuration>
               <logDate>default</logDate>
               <autoPull>true</autoPull>
               <images>
                  <!-- Postgres Image is used 'as-is' and iked into the service s linimage -->
                  <image>
                     <alias>db</alias>
                     <name>postgres:16</name>
                     <run>
                        <env>
                           <POSTGRES_PASSWORD>password</POSTGRES_PASSWORD>
                        </env>
                        <wait>
                           <log>database system is ready to accept connections</log>
                           <time>20000</time>
                        </wait>
                        <log>
                           <prefix>DB</prefix>
                           <color>yellow</color>
                        </log>
                     </run>
                  </image>
               </images>
            </configuration>

            <!-- Hooking into the lifecycle -->
            <executions>
               <execution>
                  <id>start</id>
                  <phase>pre-integration-test</phase>
                  <goals>
                     <goal>build</goal>
                     <goal>start</goal>
                  </goals>
               </execution>
               <execution>
                  <id>stop</id>
                  <phase>post-integration-test</phase>
                  <goals>
                     <goal>stop</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>

         <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.8</version>
            <executions>
               <!-- Prepares the property pointing to the JaCoCo runtime agent which is passed as VM argument when Maven the Surefire plugin is executed. -->
               <execution>
                  <goals>
                     <goal>prepare-agent</goal>
                  </goals>
                  <configuration>
                     <!-- Sets the path to the file which contains the execution data. -->
                     <destFile>${project.build.directory}/coverage-reports/jacoco.exec</destFile>
                     <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. -->
                     <propertyName>surefireArgLine</propertyName>
                     <excludes>
                        <exclude>**/com/zaxxer/hikari/util/JavassistProxyFactory*</exclude>
                        <exclude>**/com/zaxxer/hikari/pool/HikariProxy*</exclude>
                        <exclude>**/com/zaxxer/hikari/metrics/**</exclude>
                     </excludes>
                  </configuration>
               </execution>
               <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run. -->
               <execution>
                  <id>report</id>
                  <phase>test</phase>
                  <goals>
                     <goal>report</goal>
                  </goals>
                  <configuration>
                     <!-- Sets the path to the file which contains the execution data. -->
                     <dataFile>${project.build.directory}/coverage-reports/jacoco.exec</dataFile>
                     <excludes>
                        <exclude>**/com/zaxxer/hikari/pool/HikariProxy*</exclude>
                        <exclude>**/com/zaxxer/hikari/metrics/**</exclude>
                     </excludes>
                  </configuration>
               </execution>
            </executions>
         </plugin>

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>3.0.0-M3</version>
            <executions>
               <execution>
                  <goals>
                     <goal>integration-test</goal>
                     <goal>verify</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>

         <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>${felix.bundle.plugin.version}</version>
            <extensions>true</extensions>
            <configuration>
               <classifier>${artifact.classifier}</classifier>
               <instructions>
                  <Automatic-Module-Name>com.zaxxer.hikari</Automatic-Module-Name>
                  <!-- Multi-Release>true</Multi-Release-->
                  <Bundle-Name>HikariCP</Bundle-Name>
                  <Export-Package>
                     com.zaxxer.hikari,
                     com.zaxxer.hikari.hibernate,
                     com.zaxxer.hikari.metrics,
                     com.zaxxer.hikari.metrics.dropwizard,
                     com.zaxxer.hikari.metrics.micrometer,
                     com.zaxxer.hikari.metrics.prometheus
                  </Export-Package>
                  <Private-Package>com.zaxxer.hikari.*</Private-Package>
                  <Include-Resource>target/classes/module-info.class</Include-Resource>
                  <_exportcontents>
                     com.zaxxer.hikari.pool,
                     com.zaxxer.hikari.util
                  </_exportcontents>
                  <Import-Package>
                     javax.management,
                     javax.naming,
                     javax.naming.spi,
                     javax.sql,
                     javax.sql.rowset,
                     javax.sql.rowset.serial,
                     javax.sql.rowset.spi,
                     com.codahale.metrics;resolution:=optional,
                     com.codahale.metrics.health;resolution:=optional,
                     io.dropwizard.metrics5;resolution:=optional,
                     io.micrometer.core.instrument;resolution:=optional,
                     org.slf4j;version="[1.6,2)",
                     org.hibernate;resolution:=optional,
                     org.hibernate.cfg;resolution:=optional,
                     org.hibernate.engine.jdbc.connections.spi;resolution:=optional,
                     org.hibernate.service;resolution:=optional,
                     org.hibernate.service.spi;resolution:=optional
                  </Import-Package>
                  <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                  <DynamicImport-Package>*</DynamicImport-Package>
               </instructions>
            </configuration>
            <executions>
               <!-- This execution makes sure that the manifest is available when the tests are executed -->
               <execution>
                  <goals>
                     <goal>manifest</goal>
                  </goals>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>

   <profiles>
      <profile>
         <id>felix</id>
         <activation>
            <activeByDefault>true</activeByDefault>
            <property>
               <name>pax.exam.framework</name>
               <value>felix</value>
            </property>
         </activation>
         <properties>
            <pax.exam.framework>felix</pax.exam.framework>
            <pax.exam.logging>none</pax.exam.logging>
         </properties>
         <dependencies>
            <dependency>
               <groupId>org.apache.felix</groupId>
               <artifactId>org.apache.felix.framework</artifactId>
               <version>${felix.version}</version>
               <scope>test</scope>
            </dependency>
         </dependencies>
      </profile>

      <profile>
         <id>release</id>
         <activation>
            <property>
               <name>performRelease</name>
               <value>true</value>
            </property>
         </activation>
         <build>
            <plugins>
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-source-plugin</artifactId>
                  <version>3.3.0</version>
                  <executions>
                     <execution>
                        <id>attach-sources</id>
                        <goals>
                           <goal>jar-no-fork</goal>
                        </goals>
                     </execution>
                  </executions>
               </plugin>

               <!-- For release: mvn release:perform -Darguments=-Dgpg.passphrase=PASSPHRASE
                      With gpg2 you don't need to pass the passphrase; the GPG agent will prompt for it. -->
               <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-gpg-plugin</artifactId>
                  <executions>
                     <execution>
                        <id>sign-artifacts</id>
                        <phase>verify</phase>
                        <goals>
                           <goal>sign</goal>
                        </goals>
                     </execution>
                  </executions>
               </plugin>

               <!-- nexus-staging-maven-plugin replaces the standard maven-deploy-plugin for releases and
                    is useful for ensuring artifacts are all-or-nothing, as well as allowing artifacts to
                    be reviewed before they're made public -->
               <plugin>
                  <groupId>org.sonatype.plugins</groupId>
                  <artifactId>nexus-staging-maven-plugin</artifactId>
                  <extensions>true</extensions>
                  <configuration>
                     <autoReleaseAfterClose>${autoReleaseStagedArtifacts}</autoReleaseAfterClose>
                     <nexusUrl>https://ossrh-staging-api.central.sonatype.com</nexusUrl>
                     <serverId>ossrh</serverId>
                  </configuration>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
</project>


================================================
FILE: src/main/java/com/zaxxer/hikari/HikariConfig.java
================================================
/*
 * 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;

import com.codahale.metrics.health.HealthCheckRegistry;
import com.zaxxer.hikari.metrics.MetricsTrackerFactory;
import com.zaxxer.hikari.util.Credentials;
import com.zaxxer.hikari.util.PropertyElf;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import java.io.*;
import java.lang.reflect.Modifier;
import java.security.AccessControlException;
import java.sql.Connection;
import java.util.Properties;
import java.util.TreeSet;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicReference;

import static com.zaxxer.hikari.util.UtilityElf.*;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;

@SuppressWarnings({"SameParameterValue", "unused"})
public class HikariConfig implements HikariConfigMXBean
{
   private static final Logger LOGGER = LoggerFactory.getLogger(HikariConfig.class);

   private static final char[] ID_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
   private static final long CONNECTION_TIMEOUT = SECONDS.toMillis(30);
   private static final long VALIDATION_TIMEOUT = SECONDS.toMillis(5);
   private static final long SOFT_TIMEOUT_FLOOR = Long.getLong("com.zaxxer.hikari.timeoutMs.floor", 250L);
   private static final long IDLE_TIMEOUT = MINUTES.toMillis(10);
   private static final long MAX_LIFETIME = MINUTES.toMillis(30);
   private static final long DEFAULT_KEEPALIVE_TIME = MINUTES.toMillis(2);
   private static final int DEFAULT_POOL_SIZE = 10;

   private static boolean unitTest = false;

   // Properties changeable at runtime through the HikariConfigMXBean
   //
   private volatile String catalog;
   private volatile long connectionTimeout;
   private volatile long validationTimeout;
   private volatile long idleTimeout;
   private volatile long leakDetectionThreshold;
   private volatile long maxLifetime;
   private volatile int maxPoolSize;
   private volatile int minIdle;
   private final AtomicReference<Credentials> credentials = new AtomicReference<>(Credentials.of(null, null));

   // Properties NOT changeable at runtime
   //
   private long initializationFailTimeout;
   private String connectionInitSql;
   private String connectionTestQuery;
   private String credentialsProviderClassName;
   private String dataSourceClassName;
   private String dataSourceJndiName;
   private String driverClassName;
   private String exceptionOverrideClassName;
   private SQLExceptionOverride exceptionOverride;
   private String jdbcUrl;
   private String poolName;
   private String schema;
   private String transactionIsolationName;
   private boolean isAutoCommit;
   private boolean isReadOnly;
   private boolean isIsolateInternalQueries;
   private boolean isRegisterMbeans;
   private boolean isAllowPoolSuspension;
   private HikariCredentialsProvider credentialsProvider;
   private DataSource dataSource;
   private Properties dataSourceProperties;
   private ThreadFactory threadFactory;
   private ScheduledExecutorService scheduledExecutor;
   private MetricsTrackerFactory metricsTrackerFactory;
   private Object metricRegistry;
   private Object healthCheckRegistry;
   private Properties healthCheckProperties;

   private long keepaliveTime;

   private volatile boolean sealed;

   /**
    * Default constructor
    * <p>
    * If the System property {@code hikari.configurationFile} is set,
    * then the default constructor will attempt to load the specified configuration file
    * <p>
    * {@link #HikariConfig(String propertyFileName)} can be similarly used
    * instead of using the system property
    */
   public HikariConfig()
   {
      dataSourceProperties = new Properties();
      healthCheckProperties = new Properties();

      minIdle = -1;
      maxPoolSize = DEFAULT_POOL_SIZE;
      maxLifetime = MAX_LIFETIME;
      connectionTimeout = CONNECTION_TIMEOUT;
      validationTimeout = VALIDATION_TIMEOUT;
      idleTimeout = IDLE_TIMEOUT;
      initializationFailTimeout = 1;
      isAutoCommit = true;
      keepaliveTime = DEFAULT_KEEPALIVE_TIME;

      var systemProp = System.getProperty("hikaricp.configurationFile");
      if (systemProp != null) {
         loadProperties(systemProp);
      }
   }

   /**
    * Construct a HikariConfig from the specified properties object.
    *
    * @param properties the name of the property file
    */
   public HikariConfig(Properties properties)
   {
      this();
      PropertyElf.setTargetFromProperties(this, properties);
   }

   /**
    * Construct a HikariConfig from the specified property file name.  <code>propertyFileName</code>
    * will first be treated as a path in the file-system, and if that fails the
    * Class.getResourceAsStream(propertyFileName) will be tried.
    *
    * @param propertyFileName the name of the property file
    */
   public HikariConfig(String propertyFileName)
   {
      this();

      loadProperties(propertyFileName);
   }

   // ***********************************************************************
   //                       HikariConfigMXBean methods
   // ***********************************************************************

   /** {@inheritDoc} */
   @Override
   public String getCatalog()
   {
      return catalog;
   }

   /** {@inheritDoc} */
   @Override
   public void setCatalog(String catalog)
   {
      this.catalog = catalog;
   }


   /** {@inheritDoc} */
   @Override
   public long getConnectionTimeout()
   {
      return connectionTimeout;
   }

   /** {@inheritDoc} */
   @Override
   public void setConnectionTimeout(long connectionTimeoutMs)
   {
      if (connectionTimeoutMs == 0) {
         this.connectionTimeout = Integer.MAX_VALUE;
      }
      else if (connectionTimeoutMs < SOFT_TIMEOUT_FLOOR) {
         throw new IllegalArgumentException("connectionTimeout cannot be less than " + SOFT_TIMEOUT_FLOOR + "ms");
      }
      else {
         this.connectionTimeout = connectionTimeoutMs;
      }
   }

   /** {@inheritDoc} */
   @Override
   public long getIdleTimeout()
   {
      return idleTimeout;
   }

   /** {@inheritDoc} */
   @Override
   public void setIdleTimeout(long idleTimeoutMs)
   {
      if (idleTimeoutMs < 0) {
         throw new IllegalArgumentException("idleTimeout cannot be negative");
      }
      this.idleTimeout = idleTimeoutMs;
   }

   /** {@inheritDoc} */
   @Override
   public long getLeakDetectionThreshold()
   {
      return leakDetectionThreshold;
   }

   /** {@inheritDoc} */
   @Override
   public void setLeakDetectionThreshold(long leakDetectionThresholdMs)
   {
      this.leakDetectionThreshold = leakDetectionThresholdMs;
   }

   /** {@inheritDoc} */
   @Override
   public long getMaxLifetime()
   {
      return maxLifetime;
   }

   /** {@inheritDoc} */
   @Override
   public void setMaxLifetime(long maxLifetimeMs)
   {
      this.maxLifetime = maxLifetimeMs;
   }

   /** {@inheritDoc} */
   @Override
   public int getMaximumPoolSize()
   {
      return maxPoolSize;
   }

   /** {@inheritDoc} */
   @Override
   public void setMaximumPoolSize(int maxPoolSize)
   {
      if (maxPoolSize < 1) {
         throw new IllegalArgumentException("maxPoolSize cannot be less than 1");
      }
      this.maxPoolSize = maxPoolSize;
   }

   /** {@inheritDoc} */
   @Override
   public int getMinimumIdle()
   {
      return minIdle;
   }

   /** {@inheritDoc} */
   @Override
   public void setMinimumIdle(int minIdle)
   {
      if (minIdle < 0) {
         throw new IllegalArgumentException("minimumIdle cannot be negative");
      }
      this.minIdle = minIdle;
   }

   /**
    * Get the default password to use for DataSource.getConnection(username, password) calls.
    * @return the password
    */
   public String getPassword()
   {
      return credentials.get().getPassword();
   }

   /**
    * Set the default password to use for DataSource.getConnection(username, password) calls.
    * @param password the password
    */
   @Override
   public void setPassword(String password)
   {
      credentials.updateAndGet(current -> Credentials.of(current.getUsername(), password));
   }

   /**
    * Get the default username used for DataSource.getConnection(username, password) calls.
    *
    * @return the username
    */
   public String getUsername()
   {
      return credentials.get().getUsername();
   }

   /**
    * Set the default username used for DataSource.getConnection(username, password) calls.
    *
    * @param username the username
    */
   @Override
   public void setUsername(String username)
   {
      credentials.updateAndGet(current -> Credentials.of(username, current.getPassword()));
   }

   /**
    * Atomically set the default username and password to use for DataSource.getConnection(username, password) calls.
    *
    * @param credentials the username and password pair
    */
   @Override
   public void setCredentials(final Credentials credentials)
   {
      this.credentials.set(credentials);
   }

   /**
    * Atomically get the default username and password to use for DataSource.getConnection(username, password) calls.
    *
    * @return the username and password pair
    */
   public Credentials getCredentials()
   {
      return credentials.get();
   }

   /** {@inheritDoc} */
   @Override
   public long getValidationTimeout()
   {
      return validationTimeout;
   }

   /** {@inheritDoc} */
   @Override
   public void setValidationTimeout(long validationTimeoutMs)
   {
      if (validationTimeoutMs < SOFT_TIMEOUT_FLOOR) {
         throw new IllegalArgumentException("validationTimeout cannot be less than " + SOFT_TIMEOUT_FLOOR + "ms");
      }

      this.validationTimeout = validationTimeoutMs;
   }

   // ***********************************************************************
   //                     All other configuration methods
   // ***********************************************************************

   /**
    * Get the SQL query to be executed to test the validity of connections.
    *
    * @return the SQL query string, or null
    */
   public String getConnectionTestQuery()
   {
      return connectionTestQuery;
   }

   /**
    * Set the SQL query to be executed to test the validity of connections. Using
    * the JDBC4 <code>Connection.isValid()</code> method to test connection validity can
    * be more efficient on some databases and is recommended.
    *
    * @param connectionTestQuery a SQL query string
    */
   public void setConnectionTestQuery(String connectionTestQuery)
   {
      checkIfSealed();
      this.connectionTestQuery = connectionTestQuery;
   }

   /**
    * Get the SQL string that will be executed on all new connections when they are
    * created, before they are added to the pool.
    *
    * @return the SQL to execute on new connections, or null
    */
   public String getConnectionInitSql()
   {
      return connectionInitSql;
   }

   /**
    * Set the SQL string that will be executed on all new connections when they are
    * created, before they are added to the pool.  If this query fails, it will be
    * treated as a failed connection attempt.
    *
    * @param connectionInitSql the SQL to execute on new connections
    */
   public void setConnectionInitSql(String connectionInitSql)
   {
      checkIfSealed();
      this.connectionInitSql = connectionInitSql;
   }

   /**
    * Get the {@link DataSource} that has been explicitly specified to be wrapped by the
    * pool.
    *
    * @return the {@link DataSource} instance, or null
    */
   public DataSource getDataSource()
   {
      return dataSource;
   }

   /**
    * Set a {@link DataSource} for the pool to explicitly wrap.  This setter is not
    * available through property file based initialization.
    *
    * @param dataSource a specific {@link DataSource} to be wrapped by the pool
    */
   public void setDataSource(DataSource dataSource)
   {
      checkIfSealed();
      this.dataSource = dataSource;
   }

   /**
    * Get the name of the JDBC {@link DataSource} class used to create Connections.
    *
    * @return the fully qualified name of the JDBC {@link DataSource} class
    */
   public String getDataSourceClassName()
   {
      return dataSourceClassName;
   }

   /**
    * Set the fully qualified class name of the JDBC {@link DataSource} that will be used create Connections.
    *
    * @param className the fully qualified name of the JDBC {@link DataSource} class
    */
   public void setDataSourceClassName(String className)
   {
      checkIfSealed();
      this.dataSourceClassName = className;
   }

   /**
    * Add a property (name/value pair) that will be used to configure the {@link DataSource}/{@link java.sql.Driver}.
    * <p>
    * In the case of a {@link DataSource}, the property names will be translated to Java setters following the Java Bean
    * naming convention.  For example, the property {@code cachePrepStmts} will translate into {@code setCachePrepStmts()}
    * with the {@code value} passed as a parameter.
    * <p>
    * In the case of a {@link java.sql.Driver}, the property will be added to a {@link Properties} instance that will
    * be passed to the driver during {@link java.sql.Driver#connect(String, Properties)} calls.
    *
    * @param propertyName the name of the property
    * @param value the value to be used by the DataSource/Driver
    */
   public void addDataSourceProperty(String propertyName, Object value)
   {
      checkIfSealed();
      dataSourceProperties.put(propertyName, value);
   }

   public String getDataSourceJNDI()
   {
      return this.dataSourceJndiName;
   }

   public void setDataSourceJNDI(String jndiDataSource)
   {
      checkIfSealed();
      this.dataSourceJndiName = jndiDataSource;
   }

   public Properties getDataSourceProperties()
   {
      return dataSourceProperties;
   }

   public void setDataSourceProperties(Properties dsProperties)
   {
      checkIfSealed();
      dataSourceProperties.putAll(dsProperties);
   }

   public String getDriverClassName()
   {
      return driverClassName;
   }

   public void setDriverClassName(String driverClassName)
   {
      checkIfSealed();

      try {
         createInstance(driverClassName, java.sql.Driver.class);
         this.driverClassName = driverClassName;
      }
      catch (Exception e) {
         throw new RuntimeException("Failed to load driver class " + driverClassName, e);
      }
   }

   public String getJdbcUrl()
   {
      return jdbcUrl;
   }

   public void setJdbcUrl(String jdbcUrl)
   {
      checkIfSealed();
      this.jdbcUrl = jdbcUrl;
   }

   /**
    * Get the default auto-commit behavior of connections in the pool.
    *
    * @return the default auto-commit behavior of connections
    */
   public boolean isAutoCommit()
   {
      return isAutoCommit;
   }

   /**
    * Set the default auto-commit behavior of connections in the pool.
    *
    * @param isAutoCommit the desired auto-commit default for connections
    */
   public void setAutoCommit(boolean isAutoCommit)
   {
      checkIfSealed();
      this.isAutoCommit = isAutoCommit;
   }

   /**
    * Get the pool suspension behavior (allowed or disallowed).
    *
    * @return the pool suspension behavior
    */
   public boolean isAllowPoolSuspension()
   {
      return isAllowPoolSuspension;
   }

   /**
    * Set whether or not pool suspension is allowed.  There is a performance
    * impact when pool suspension is enabled.  Unless you need it (for a
    * redundancy system for example) do not enable it.
    *
    * @param isAllowPoolSuspension the desired pool suspension allowance
    */
   public void setAllowPoolSuspension(boolean isAllowPoolSuspension)
   {
      checkIfSealed();
      this.isAllowPoolSuspension = isAllowPoolSuspension;
   }

   /**
    * Get the pool initialization failure timeout.  See {@code #setInitializationFailTimeout(long)}
    * for details.
    *
    * @return the number of milliseconds before the pool initialization fails
    * @see HikariConfig#setInitializationFailTimeout(long)
    */
   public long getInitializationFailTimeout()
   {
      return initializationFailTimeout;
   }

   /**
    * Set the pool initialization failure timeout.  This setting applies to pool
    * initialization when {@link HikariDataSource} is constructed with a {@link HikariConfig},
    * or when {@link HikariDataSource} is constructed using the no-arg constructor
    * and {@link HikariDataSource#getConnection()} is called.
    * <ul>
    *   <li>Any value greater than zero will be treated as a timeout for pool initialization.
    *       The calling thread will be blocked from continuing until a successful connection
    *       to the database, or until the timeout is reached.  If the timeout is reached, then
    *       a {@code PoolInitializationException} will be thrown. </li>
    *   <li>A value of zero will <i>not</i>  prevent the pool from starting in the
    *       case that a connection cannot be obtained. However, upon start the pool will
    *       attempt to obtain a connection and validate that the {@code connectionTestQuery}
    *       and {@code connectionInitSql} are valid.  If those validations fail, an exception
    *       will be thrown.  If a connection cannot be obtained, the validation is skipped
    *       and the the pool will start and continue to try to obtain connections in the
    *       background.  This can mean that callers to {@code DataSource#getConnection()} may
    *       encounter exceptions. </li>
    *   <li>A value less than zero will bypass any connection attempt and validation during
    *       startup, and therefore the pool will start immediately.  The pool will continue to
    *       try to obtain connections in the background. This can mean that callers to
    *       {@code DataSource#getConnection()} may encounter exceptions. </li>
    * </ul>
    * Note that if this timeout value is greater than or equal to zero (0), and therefore an
    * initial connection validation is performed, this timeout does not override the
    * {@code connectionTimeout} or {@code validationTimeout}; they will be honored before this
    * timeout is applied.  The default value is one millisecond.
    *
    * @param initializationFailTimeout the number of milliseconds before the
    *        pool initialization fails, or 0 to validate connection setup but continue with
    *        pool start, or less than zero to skip all initialization checks and start the
    *        pool without delay.
    */
   public void setInitializationFailTimeout(long initializationFailTimeout)
   {
      checkIfSealed();
      this.initializationFailTimeout = initializationFailTimeout;
   }

   /**
    * Determine whether internal pool queries, principally aliveness checks, will be isolated in their own transaction
    * via {@link Connection#rollback()}.  Defaults to {@code false}.
    *
    * @return {@code true} if internal pool queries are isolated, {@code false} if not
    */
   public boolean isIsolateInternalQueries()
   {
      return isIsolateInternalQueries;
   }

   /**
    * Configure whether internal pool queries, principally aliveness checks, will be isolated in their own transaction
    * via {@link Connection#rollback()}.  Defaults to {@code false}.
    *
    * @param isolate {@code true} if internal pool queries should be isolated, {@code false} if not
    */
   public void setIsolateInternalQueries(boolean isolate)
   {
      checkIfSealed();
      this.isIsolateInternalQueries = isolate;
   }

   public MetricsTrackerFactory getMetricsTrackerFactory()
   {
      return metricsTrackerFactory;
   }

   public void setMetricsTrackerFactory(MetricsTrackerFactory metricsTrackerFactory)
   {
      if (metricRegistry != null) {
         throw new IllegalStateException("cannot use setMetricsTrackerFactory() and setMetricRegistry() together");
      }

      this.metricsTrackerFactory = metricsTrackerFactory;
   }

   /**
    * Get the MetricRegistry instance to use for registration of metrics used by HikariCP.  Default is {@code null}.
    *
    * @return the MetricRegistry instance that will be used
    */
   public Object getMetricRegistry()
   {
      return metricRegistry;
   }

   /**
    * Set a MetricRegistry instance to use for registration of metrics used by HikariCP.
    *
    * @param metricRegistry the MetricRegistry instance to use
    */
   public void setMetricRegistry(Object metricRegistry)
   {
      if (metricsTrackerFactory != null) {
         throw new IllegalStateException("cannot use setMetricRegistry() and setMetricsTrackerFactory() together");
      }

      if (metricRegistry != null) {
         metricRegistry = getObjectOrPerformJndiLookup(metricRegistry);

         if (!safeIsAssignableFrom(metricRegistry, "com.codahale.metrics.MetricRegistry")
             && !(safeIsAssignableFrom(metricRegistry, "io.dropwizard.metrics5.MetricRegistry"))
             && !(safeIsAssignableFrom(metricRegistry, "io.micrometer.core.instrument.MeterRegistry"))) {
            throw new IllegalArgumentException("Class must be instance of com.codahale.metrics.MetricRegistry, " +
               "io.dropwizard.metrics5.MetricRegistry, or io.micrometer.core.instrument.MeterRegistry");
         }
      }

      this.metricRegistry = metricRegistry;
   }

   /**
    * Get the HealthCheckRegistry that will be used for registration of health checks by HikariCP.  Currently only
    * Codahale/DropWizard is supported for health checks.
    *
    * @return the HealthCheckRegistry instance that will be used
    */
   public Object getHealthCheckRegistry()
   {
      return healthCheckRegistry;
   }

   /**
    * Set the HealthCheckRegistry that will be used for registration of health checks by HikariCP.  Currently only
    * Codahale/DropWizard is supported for health checks.  Default is {@code null}.
    *
    * @param healthCheckRegistry the HealthCheckRegistry to be used
    */
   public void setHealthCheckRegistry(Object healthCheckRegistry)
   {
      checkIfSealed();

      if (healthCheckRegistry != null) {
         healthCheckRegistry = getObjectOrPerformJndiLookup(healthCheckRegistry);

         if (!(healthCheckRegistry instanceof HealthCheckRegistry)) {
            throw new IllegalArgumentException("Class must be an instance of com.codahale.metrics.health.HealthCheckRegistry");
         }
      }

      this.healthCheckRegistry = healthCheckRegistry;
   }

   public Properties getHealthCheckProperties()
   {
      return healthCheckProperties;
   }

   public void setHealthCheckProperties(Properties healthCheckProperties)
   {
      checkIfSealed();
      this.healthCheckProperties.putAll(healthCheckProperties);
   }

   public void addHealthCheckProperty(String key, String value)
   {
      checkIfSealed();
      healthCheckProperties.setProperty(key, value);
   }

   /**
    * This property controls the keepalive interval for a connection in the pool. An in-use connection will never be
    * tested by the keepalive thread, only when it is idle will it be tested.
    *
    * @return the interval in which connections will be tested for aliveness, thus keeping them alive by the act of checking. Value is in milliseconds, default is 0 (disabled).
    */
   public long getKeepaliveTime() {
      return keepaliveTime;
   }

   /**
    * This property controls the keepalive interval for a connection in the pool. An in-use connection will never be
    * tested by the keepalive thread, only when it is idle will it be tested.
    *
    * @param keepaliveTimeMs the interval in which connections will be tested for aliveness, thus keeping them alive by the act of checking. Value is in milliseconds, default is 0 (disabled).
    */
   public void setKeepaliveTime(long keepaliveTimeMs) {
      this.keepaliveTime = keepaliveTimeMs;
   }

   /**
    * Determine whether the Connections in the pool are in read-only mode.
    *
    * @return {@code true} if the Connections in the pool are read-only, {@code false} if not
    */
   public boolean isReadOnly()
   {
      return isReadOnly;
   }

   /**
    * Configures the Connections to be added to the pool as read-only Connections.
    *
    * @param readOnly {@code true} if the Connections in the pool are read-only, {@code false} if not
    */
   public void setReadOnly(boolean readOnly)
   {
      checkIfSealed();
      this.isReadOnly = readOnly;
   }

   /**
    * Determine whether HikariCP will self-register {@link HikariConfigMXBean} and {@link HikariPoolMXBean} instances
    * in JMX.
    *
    * @return {@code true} if HikariCP will register MXBeans, {@code false} if it will not
    */
   public boolean isRegisterMbeans()
   {
      return isRegisterMbeans;
   }

   /**
    * Configures whether HikariCP self-registers the {@link HikariConfigMXBean} and {@link HikariPoolMXBean} in JMX.
    *
    * @param register {@code true} if HikariCP should register MXBeans, {@code false} if it should not
    */
   public void setRegisterMbeans(boolean register)
   {
      checkIfSealed();
      this.isRegisterMbeans = register;
   }

   /** {@inheritDoc} */
   @Override
   public String getPoolName()
   {
      return poolName;
   }

   /**
    * Set the name of the connection pool.  This is primarily used in logging and JMX management consoles
    * to identify pools and pool configurations
    *
    * @param poolName the name of the connection pool to use
    */
   public void setPoolName(String poolName)
   {
      checkIfSealed();
      this.poolName = poolName;
   }

   /**
    * Get the ScheduledExecutorService used for housekeeping.
    *
    * @return the executor
    */
   public ScheduledExecutorService getScheduledExecutor()
   {
      return scheduledExecutor;
   }

   /**
    * Set the ScheduledExecutorService used for housekeeping.
    *
    * @param executor the ScheduledExecutorService
    */
   public void setScheduledExecutor(ScheduledExecutorService executor)
   {
      checkIfSealed();
      this.scheduledExecutor = executor;
   }

   public String getTransactionIsolation()
   {
      return transactionIsolationName;
   }

   /**
    * Get the default schema name to be set on connections.
    *
    * @return the default schema name
    */
   public String getSchema()
   {
      return schema;
   }

   /**
    * Set the default schema name to be set on connections.
    *
    * @param schema the name of the default schema
    */
   public void setSchema(String schema)
   {
      checkIfSealed();
      this.schema = schema;
   }

   /**
    * Get the class name of the {@link HikariCredentialsProvider} that will be used to get credentials at runtime.
    *
    * @return the class name of the credentials provider
    * @see HikariCredentialsProvider
    */
   public String getCredentialsProviderClassName()
   {
      return credentialsProviderClassName;
   }

   /**
    * Set the class name of the {@link HikariCredentialsProvider} that will be used to get credentials at runtime. Use this method
    * or provide a {@link HikariCredentialsProvider} instance via the {@link #setCredentialsProvider(HikariCredentialsProvider)} method.
    *
    * @param credentialsProviderClassName the class name of the credentials provider
    * @see HikariCredentialsProvider
    */
   public void setCredentialsProviderClassName(String credentialsProviderClassName) {
      checkIfSealed();

      try {
         this.credentialsProvider = createInstance(credentialsProviderClassName, HikariCredentialsProvider.class);
         this.exceptionOverrideClassName = credentialsProviderClassName;
      }
      catch (Exception e) {
         throw new RuntimeException("Failed to instantiate class " + credentialsProviderClassName, e);
      }
   }

   /**
    * Get the {@link HikariCredentialsProvider} instance created by {@link #setCredentialsProviderClassName(String)} or specified by
    * {@link #setCredentialsProvider(HikariCredentialsProvider)}.
    *
    * @return the HikariCredentialsProvider instance, or null
    * @see HikariCredentialsProvider
    */
   public HikariCredentialsProvider getCredentialsProvider() {
      return credentialsProvider;
   }

   /**
    * Set a user supplied {@link HikariCredentialsProvider} instance. If this method is used, then the {@link #setCredentialsProviderClassName(String)}
    * method should not be used. The {@link HikariCredentialsProvider} instance will be used to get credentials at runtime.
    *
    * @param credentialsProvider a user supplied HikariCredentialsProvider instance
    * @see HikariCredentialsProvider
    */
   public void setCredentialsProvider(HikariCredentialsProvider credentialsProvider) {
      checkIfSealed();
      this.credentialsProvider = credentialsProvider;
   }

   /**
    * Get the user supplied SQLExceptionOverride class name.
    *
    * @return the user supplied SQLExceptionOverride class name
    * @see SQLExceptionOverride
    */
   public String getExceptionOverrideClassName()
   {
      return this.exceptionOverrideClassName;
   }

   /**
    * Set the user supplied SQLExceptionOverride class name.
    *
    * @param exceptionOverrideClassName the user supplied SQLExceptionOverride class name
    * @see SQLExceptionOverride
    */
   public void setExceptionOverrideClassName(String exceptionOverrideClassName)
   {
      checkIfSealed();

      try {
         this.exceptionOverride = createInstance(exceptionOverrideClassName, SQLExceptionOverride.class);
         this.exceptionOverrideClassName = exceptionOverrideClassName;
      }
      catch (Exception e) {
         throw new RuntimeException("Failed to instantiate class " + exceptionOverrideClassName, e);
      }
   }

   /**
    * Get the SQLExceptionOverride instance created by {@link #setExceptionOverrideClassName(String)} or specified by
    * {@link #setExceptionOverride(SQLExceptionOverride)}.
    *
    * @return the SQLExceptionOverride instance, or null
    * @see SQLExceptionOverride
    */
   public SQLExceptionOverride getExceptionOverride()
   {
      return this.exceptionOverride;
   }

   /**
    * Set the user supplied SQLExceptionOverride instance.
    *
    * @param exceptionOverride the user supplied SQLExceptionOverride instance
    * @see SQLExceptionOverride
    */
   public void setExceptionOverride(SQLExceptionOverride exceptionOverride) {
      checkIfSealed();
      this.exceptionOverride = exceptionOverride;
   }

   /**
    * Set the default transaction isolation level.  The specified value is the
    * constant name from the <code>Connection</code> class, eg.
    * <code>TRANSACTION_REPEATABLE_READ</code>.
    *
    * @param isolationLevel the name of the isolation level
    */
   public void setTransactionIsolation(String isolationLevel)
   {
      checkIfSealed();
      this.transactionIsolationName = isolationLevel;
   }

   /**
    * Get the thread factory used to create threads.
    *
    * @return the thread factory (may be null, in which case the default thread factory is used)
    */
   public ThreadFactory getThreadFactory()
   {
      return threadFactory;
   }

   /**
    * Set the thread factory to be used to create threads.
    *
    * @param threadFactory the thread factory (setting to null causes the default thread factory to be used)
    */
   public void setThreadFactory(ThreadFactory threadFactory)
   {
      checkIfSealed();
      this.threadFactory = threadFactory;
   }

   void seal()
   {
      this.sealed = true;
   }

   /**
    * Copies the state of {@code this} into {@code other}.
    *
    * @param other Other {@link HikariConfig} to copy the state to.
    */
   @SuppressWarnings({"rawtypes", "unchecked"})
   public void copyStateTo(HikariConfig other)
   {
      for (var field : HikariConfig.class.getDeclaredFields()) {
         try {
            if (!Modifier.isFinal(field.getModifiers())) {
               field.setAccessible(true);
               field.set(other, field.get(this));
            } else if (field.getType().isAssignableFrom(AtomicReference.class)) {
               ((AtomicReference) field.get(other)).set(((AtomicReference) field.get(this)).get());
            }
         }
         catch (Exception e) {
            throw new RuntimeException("Failed to copy HikariConfig state: " + e.getMessage(), e);
         }
      }

      other.sealed = false;
   }

   // ***********************************************************************
   //                          Private methods
   // ***********************************************************************

   @SuppressWarnings("StatementWithEmptyBody")
   public void validate()
   {
      if (poolName == null) {
         poolName = generatePoolName();
      }
      else if (isRegisterMbeans && poolName.contains(":")) {
         throw new IllegalArgumentException("poolName cannot contain ':' when used with JMX");
      }

      // treat empty property as null
      //noinspection NonAtomicOperationOnVolatileField
      catalog = getNullIfEmpty(catalog);
      connectionInitSql = getNullIfEmpty(connectionInitSql);
      connectionTestQuery = getNullIfEmpty(connectionTestQuery);
      transactionIsolationName = getNullIfEmpty(transactionIsolationName);
      dataSourceClassName = getNullIfEmpty(dataSourceClassName);
      dataSourceJndiName = getNullIfEmpty(dataSourceJndiName);
      driverClassName = getNullIfEmpty(driverClassName);
      jdbcUrl = getNullIfEmpty(jdbcUrl);

      // Check Data Source Options
      if (dataSource != null) {
         if (dataSourceClassName != null) {
            LOGGER.warn("{} - using dataSource and ignoring dataSourceClassName.", poolName);
         }
      }
      else if (dataSourceClassName != null) {
         if (driverClassName != null) {
            LOGGER.error("{} - cannot use driverClassName and dataSourceClassName together.", poolName);
            // NOTE: This exception text is referenced by a Spring Boot FailureAnalyzer, it should not be
            // changed without first notifying the Spring Boot developers.
            throw new IllegalStateException("cannot use driverClassName and dataSourceClassName together.");
         }
         else if (jdbcUrl != null) {
            LOGGER.warn("{} - using dataSourceClassName and ignoring jdbcUrl.", poolName);
         }
      }
      else if (jdbcUrl != null || dataSourceJndiName != null) {
         // ok
      }
      else if (driverClassName != null) {
         LOGGER.error("{} - jdbcUrl is required with driverClassName.", poolName);
         throw new IllegalArgumentException("jdbcUrl is required with driverClassName.");
      }
      else {
         LOGGER.error("{} - dataSource or dataSourceClassName or jdbcUrl is required.", poolName);
         throw new IllegalArgumentException("dataSource or dataSourceClassName or jdbcUrl is required.");
      }

      validateNumerics();

      if (LOGGER.isDebugEnabled() || unitTest) {
         logConfiguration();
      }
   }

   private void validateNumerics()
   {
      if (maxLifetime != 0 && maxLifetime < SECONDS.toMillis(30)) {
         LOGGER.warn("{} - maxLifetime is less than 30000ms, setting to default {}ms.", poolName, MAX_LIFETIME);
         maxLifetime = MAX_LIFETIME;
      }

      // keepalive time must larger than 30 seconds
      if (keepaliveTime != 0 && keepaliveTime < SECONDS.toMillis(30)) {
         LOGGER.warn("{} - keepaliveTime is less than 30000ms, disabling it.", poolName);
         keepaliveTime = 0L;
      }

      // keepalive time must be less than maxLifetime (if maxLifetime is enabled)
      if (keepaliveTime != 0 && maxLifetime != 0 && keepaliveTime >= maxLifetime) {
         LOGGER.warn("{} - keepaliveTime is greater than or equal to maxLifetime, disabling it.", poolName);
         keepaliveTime = 0L;
      }

      if (leakDetectionThreshold > 0 && !unitTest) {
         if (leakDetectionThreshold < SECONDS.toMillis(2) || (leakDetectionThreshold > maxLifetime && maxLifetime > 0)) {
            LOGGER.warn("{} - leakDetectionThreshold is less than 2000ms or more than maxLifetime, disabling it.", poolName);
            leakDetectionThreshold = 0;
         }
      }

      if (connectionTimeout < SOFT_TIMEOUT_FLOOR) {
         LOGGER.warn("{} - connectionTimeout is less than {}ms, setting to {}ms.", poolName, SOFT_TIMEOUT_FLOOR, CONNECTION_TIMEOUT);
         connectionTimeout = CONNECTION_TIMEOUT;
      }

      if (validationTimeout < SOFT_TIMEOUT_FLOOR) {
         LOGGER.warn("{} - validationTimeout is less than {}ms, setting to {}ms.", poolName, SOFT_TIMEOUT_FLOOR, VALIDATION_TIMEOUT);
         validationTimeout = VALIDATION_TIMEOUT;
      }

      if (minIdle < 0 || minIdle > maxPoolSize) {
         minIdle = maxPoolSize;
      }

      if (idleTimeout + SECONDS.toMillis(1) > maxLifetime && maxLifetime > 0 && minIdle < maxPoolSize) {
         LOGGER.warn("{} - idleTimeout is close to or more than maxLifetime, disabling it.", poolName);
         idleTimeout = 0;
      }
      else if (idleTimeout != 0 && idleTimeout < SECONDS.toMillis(10) && minIdle < maxPoolSize) {
         LOGGER.warn("{} - idleTimeout is less than 10000ms, setting to default {}ms.", poolName, IDLE_TIMEOUT);
         idleTimeout = IDLE_TIMEOUT;
      }
      else  if (idleTimeout != IDLE_TIMEOUT && idleTimeout != 0 && minIdle == maxPoolSize) {
         LOGGER.warn("{} - idleTimeout has been set but has no effect because the pool is operating as a fixed size pool.", poolName);
      }
   }

   private void checkIfSealed()
   {
      if (sealed) throw new IllegalStateException("The configuration of the pool is sealed once started. Use HikariConfigMXBean for runtime changes.");
   }

   private void logConfiguration()
   {
      LOGGER.debug("{} - configuration:", poolName);
      final var propertyNames = new TreeSet<>(PropertyElf.getPropertyNames(HikariConfig.class));
      for (var prop : propertyNames) {
         try {
            var value = PropertyElf.getProperty(prop, this);
            if ("dataSourceProperties".equals(prop)) {
               var dsProps = PropertyElf.copyProperties(dataSourceProperties);
               dsProps.setProperty("password", "<masked>");
               value = dsProps;
            }

            if ("initializationFailTimeout".equals(prop) && initializationFailTimeout == Long.MAX_VALUE) {
               value = "infinite";
            }
            else if ("transactionIsolation".equals(prop) && transactionIsolationName == null) {
               value = "default";
            }
            else if (prop.matches("scheduledExecutorService|threadFactory") && value == null) {
               value = "internal";
            }
            else if (prop.contains("jdbcUrl") && value instanceof String) {
               value = maskPasswordInJdbcUrl((String) value);
            }
            else if (prop.contains("password")) {
               value = "<masked>";
            }
            else if (value instanceof String) {
               value = "\"" + value + "\""; // quote to see lead/trailing spaces is any
            }
            else if (value == null) {
               value = "none";
            }
            LOGGER.debug("{}{}", (prop + "................................................").substring(0, 32), value);
         }
         catch (Exception e) {
            // continue
         }
      }
   }

   private void loadProperties(String propertyFileName)
   {
      try (final var is = openPropertiesInputStream(propertyFileName)) {
         if (is != null) {
            var props = new Properties();
            props.load(is);
            PropertyElf.setTargetFromProperties(this, props);
         }
         else {
            throw new IllegalArgumentException("Cannot find property file: " + propertyFileName);
         }
      }
      catch (IOException io) {
         throw new RuntimeException("Failed to read property file", io);
      }
   }

   private InputStream openPropertiesInputStream(String propertyFileName) throws FileNotFoundException {
      final var propFile = new File(propertyFileName);
      if (propFile.isFile()) {
         return new FileInputStream(propFile);
      }
      var propertiesInputStream = this.getClass().getResourceAsStream(propertyFileName);
      if (propertiesInputStream == null) {
        propertiesInputStream = this.getClass().getClassLoader().getResourceAsStream(propertyFileName);
      }
      return propertiesInputStream;
   }

   private String generatePoolName()
   {
      final var prefix = "HikariPool-";
      try {
         // Pool number is global to the VM to avoid overlapping pool numbers in classloader scoped environments
         synchronized (System.getProperties()) {
            final var next = String.valueOf(Integer.getInteger("com.zaxxer.hikari.pool_number", 0) + 1);
            System.setProperty("com.zaxxer.hikari.pool_number", next);
            return prefix + next;
         }
      } catch (AccessControlException e) {
         // The SecurityManager didn't allow us to read/write system properties
         // so just generate a random pool number instead
         final var random = ThreadLocalRandom.current();
         final var buf = new StringBuilder(prefix);

         for (var i = 0; i < 4; i++) {
            buf.append(ID_CHARACTERS[random.nextInt(62)]);
         }

         LOGGER.info("assigned random pool name '{}' (security manager prevented access to system properties)", buf);

         return buf.toString();
      }
   }

   private Object getObjectOrPerformJndiLookup(Object object)
   {
      if (object instanceof String) {
         try {
            var initCtx = new InitialContext();
            return initCtx.lookup((String) object);
         }
         catch (NamingException e) {
            throw new IllegalArgumentException(e);
         }
      }
      return object;
   }
}


================================================
FILE: src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java
================================================
/*
 * Copyright (C) 2013 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;

import com.zaxxer.hikari.util.Credentials;

/**
 * The javax.management MBean for a Hikari pool configuration.
 *
 * @author Brett Wooldridge
 */
public interface HikariConfigMXBean
{
   /**
    * Get the maximum number of milliseconds that a client will wait for a connection from the pool. If this
    * time is exceeded without a connection becoming available, a SQLException will be thrown from
    * {@link javax.sql.DataSource#getConnection()}.
    *
    * @return the connection timeout in milliseconds
    */
   long getConnectionTimeout();

   /**
    * Set the maximum number of milliseconds that a client will wait for a connection from the pool. If this
    * time is exceeded without a connection becoming available, a SQLException will be thrown from
    * {@link javax.sql.DataSource#getConnection()}.
    *
    * @param connectionTimeoutMs the connection timeout in milliseconds
    */
   void setConnectionTimeout(long connectionTimeoutMs);

   /**
    * Get the maximum number of milliseconds that the pool will wait for a connection to be validated as
    * alive.
    *
    * @return the validation timeout in milliseconds
    */
   long getValidationTimeout();

   /**
    * Sets the maximum number of milliseconds that the pool will wait for a connection to be validated as
    * alive.
    *
    * @param validationTimeoutMs the validation timeout in milliseconds
    */
   void setValidationTimeout(long validationTimeoutMs);

   /**
    * This property controls the maximum amount of time (in milliseconds) that a connection is allowed to sit
    * idle in the pool. Whether a connection is retired as idle or not is subject to a maximum variation of +30
    * seconds, and average variation of +15 seconds. A connection will never be retired as idle before this timeout.
    * A value of 0 means that idle connections are never removed from the pool.
    *
    * @return the idle timeout in milliseconds
    */
   long getIdleTimeout();

   /**
    * This property controls the maximum amount of time (in milliseconds) that a connection is allowed to sit
    * idle in the pool. Whether a connection is retired as idle or not is subject to a maximum variation of +30
    * seconds, and average variation of +15 seconds. A connection will never be retired as idle before this timeout.
    * A value of 0 means that idle connections are never removed from the pool.
    *
    * @param idleTimeoutMs the idle timeout in milliseconds
    */
   void setIdleTimeout(long idleTimeoutMs);

   /**
    * This property controls the amount of time that a connection can be out of the pool before a message is
    * logged indicating a possible connection leak. A value of 0 means leak detection is disabled.
    *
    * @return the connection leak detection threshold in milliseconds
    */
   long getLeakDetectionThreshold();

   /**
    * This property controls the amount of time that a connection can be out of the pool before a message is
    * logged indicating a possible connection leak. A value of 0 means leak detection is disabled.
    *
    * @param leakDetectionThresholdMs the connection leak detection threshold in milliseconds
    */
   void setLeakDetectionThreshold(long leakDetectionThresholdMs);

   /**
    * This property controls the maximum lifetime of a connection in the pool. When a connection reaches this
    * timeout, even if recently used, it will be retired from the pool. An in-use connection will never be
    * retired, only when it is idle will it be removed.
    *
    * @return the maximum connection lifetime in milliseconds
    */
   long getMaxLifetime();

   /**
    * This property controls the maximum lifetime of a connection in the pool. When a connection reaches this
    * timeout, even if recently used, it will be retired from the pool. An in-use connection will never be
    * retired, only when it is idle will it be removed.
    *
    * @param maxLifetimeMs the maximum connection lifetime in milliseconds
    */
   void setMaxLifetime(long maxLifetimeMs);

   /**
    * The property controls the minimum number of idle connections that HikariCP tries to maintain in the pool,
    * including both idle and in-use connections. If the idle connections dip below this value, HikariCP will
    * make a best effort to restore them quickly and efficiently.
    *
    * @return the minimum number of connections in the pool
    */
   int getMinimumIdle();

   /**
    * The property controls the minimum number of idle connections that HikariCP tries to maintain in the pool,
    * including both idle and in-use connections. If the idle connections dip below this value, HikariCP will
    * make a best effort to restore them quickly and efficiently.
    *
    * @param minIdle the minimum number of idle connections in the pool to maintain
    */
   void setMinimumIdle(int minIdle);

   /**
    * The property controls the maximum number of connections that HikariCP will keep in the pool,
    * including both idle and in-use connections.
    *
    * @return the maximum number of connections in the pool
    */
   int getMaximumPoolSize();

   /**
    * The property controls the maximum size that the pool is allowed to reach, including both idle and in-use
    * connections. Basically this value will determine the maximum number of actual connections to the database
    * backend.
    * <p>
    * When the pool reaches this size, and no idle connections are available, calls to getConnection() will
    * block for up to connectionTimeout milliseconds before timing out.
    *
    * @param maxPoolSize the maximum number of connections in the pool
    */
   void setMaximumPoolSize(int maxPoolSize);

   /**
    * Set the password used for authentication. Changing this at runtime will apply to new connections only.
    * Altering this at runtime only works for DataSource-based connections, not Driver-class or JDBC URL-based
    * connections.
    *
    * @param password the database password
    */
   void setPassword(String password);

   /**
    * Set the username used for authentication. Changing this at runtime will apply to new connections only.
    * Altering this at runtime only works for DataSource-based connections, not Driver-class or JDBC URL-based
    * connections.
    *
    * @param username the database username
    */
   void setUsername(String username);

   /**
    * Set the username and password used for authentication. Changing this at runtime will apply to new
    * connections only. Altering this at runtime only works for DataSource-based connections, not Driver-class
    * or JDBC URL-based connections.
    *
    * @param credentials the database username and password pair
    */
   void setCredentials(Credentials credentials);

   /**
    * The name of the connection pool.
    *
    * @return the name of the connection pool
    */
   String getPoolName();

   /**
    * Get the default catalog name to be set on connections.
    *
    * @return the default catalog name
    */
   String getCatalog();

   /**
    * Set the default catalog name to be set on connections.
    * <p>
    * WARNING: THIS VALUE SHOULD ONLY BE CHANGED WHILE THE POOL IS SUSPENDED, AFTER CONNECTIONS HAVE BEEN EVICTED.
    *
    * @param catalog the catalog name, or null
    */
   void setCatalog(String catalog);
}


================================================
FILE: src/main/java/com/zaxxer/hikari/HikariCredentialsProvider.java
================================================
/*
 * Copyright (C) 2025 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;

import com.zaxxer.hikari.util.Credentials;

/**
 * Users can implement this interface to provide credentials for HikariCP.
 * This is useful when credentials need to be dynamically generated or retrieved
 * at runtime, rather than being hardcoded in the configuration.
 */
public interface HikariCredentialsProvider {
      /**
      * This method is called to retrieve the credentials for HikariCP.
      *
      * @return a {@link Credentials} object containing the username and password
      */
   Credentials getCredentials();
}


================================================
FILE: src/main/java/com/zaxxer/hikari/HikariDataSource.java
================================================
/*
 * C
Download .txt
gitextract_ly1ilzq_/

├── .circleci/
│   └── config.yml
├── .editorconfig
├── .github/
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .settings/
│   ├── org.eclipse.core.resources.prefs
│   ├── org.eclipse.jdt.apt.core.prefs
│   ├── org.eclipse.jdt.core.prefs
│   ├── org.eclipse.m2e.core.prefs
│   └── org.eclipse.pde.core.prefs
├── CHANGES
├── KEYS.txt
├── LICENSE
├── README.md
├── codecov.yml
├── documents/
│   ├── Wall-of-Fame.md
│   └── Welcome-To-The-Jungle.md
├── install-jdk.sh
├── osx-toolchains.xml
├── pom.xml
└── src/
    ├── main/
    │   └── java/
    │       ├── com/
    │       │   └── zaxxer/
    │       │       └── hikari/
    │       │           ├── HikariConfig.java
    │       │           ├── HikariConfigMXBean.java
    │       │           ├── HikariCredentialsProvider.java
    │       │           ├── HikariDataSource.java
    │       │           ├── HikariJNDIFactory.java
    │       │           ├── HikariPoolMXBean.java
    │       │           ├── SQLExceptionOverride.java
    │       │           ├── hibernate/
    │       │           │   ├── HikariConfigurationUtil.java
    │       │           │   └── HikariConnectionProvider.java
    │       │           ├── metrics/
    │       │           │   ├── IMetricsTracker.java
    │       │           │   ├── MetricsTracker.java
    │       │           │   ├── MetricsTrackerFactory.java
    │       │           │   ├── PoolStats.java
    │       │           │   ├── dropwizard/
    │       │           │   │   ├── CodaHaleMetricsTracker.java
    │       │           │   │   ├── CodahaleHealthChecker.java
    │       │           │   │   ├── CodahaleMetricsTrackerFactory.java
    │       │           │   │   ├── Dropwizard5MetricsTracker.java
    │       │           │   │   ├── Dropwizard5MetricsTrackerFactory.java
    │       │           │   │   └── DropwizardCommon.java
    │       │           │   ├── micrometer/
    │       │           │   │   ├── MicrometerMetricsTracker.java
    │       │           │   │   └── MicrometerMetricsTrackerFactory.java
    │       │           │   └── prometheus/
    │       │           │       ├── HikariCPCollector.java
    │       │           │       ├── PrometheusHistogramMetricsTracker.java
    │       │           │       ├── PrometheusHistogramMetricsTrackerFactory.java
    │       │           │       ├── PrometheusMetricsTracker.java
    │       │           │       └── PrometheusMetricsTrackerFactory.java
    │       │           ├── pool/
    │       │           │   ├── HikariPool.java
    │       │           │   ├── PoolBase.java
    │       │           │   ├── PoolEntry.java
    │       │           │   ├── ProxyCallableStatement.java
    │       │           │   ├── ProxyConnection.java
    │       │           │   ├── ProxyDatabaseMetaData.java
    │       │           │   ├── ProxyFactory.java
    │       │           │   ├── ProxyLeakTask.java
    │       │           │   ├── ProxyLeakTaskFactory.java
    │       │           │   ├── ProxyPreparedStatement.java
    │       │           │   ├── ProxyResultSet.java
    │       │           │   └── ProxyStatement.java
    │       │           └── util/
    │       │               ├── ClockSource.java
    │       │               ├── ConcurrentBag.java
    │       │               ├── Credentials.java
    │       │               ├── DriverDataSource.java
    │       │               ├── FastList.java
    │       │               ├── IsolationLevel.java
    │       │               ├── JavassistProxyFactory.java
    │       │               ├── PropertyElf.java
    │       │               ├── SuspendResumeLock.java
    │       │               └── UtilityElf.java
    │       └── module-info.java
    └── test/
        ├── java/
        │   └── com/
        │       └── zaxxer/
        │           └── hikari/
        │               ├── HikariConfigTest.java
        │               ├── datasource/
        │               │   └── TestSealedConfig.java
        │               ├── db/
        │               │   └── BasicPoolTest.java
        │               ├── metrics/
        │               │   ├── dropwizard/
        │               │   │   ├── CodaHaleMetricsTrackerTest.java
        │               │   │   └── Dropwizard5MetricsTrackerTest.java
        │               │   ├── micrometer/
        │               │   │   └── MicrometerMetricsTrackerTest.java
        │               │   └── prometheus/
        │               │       ├── HikariCPCollectorTest.java
        │               │       ├── PrometheusHistogramMetricsTrackerFactoryTest.java
        │               │       ├── PrometheusHistogramMetricsTrackerTest.java
        │               │       ├── PrometheusMetricsTrackerFactoryTest.java
        │               │       └── PrometheusMetricsTrackerTest.java
        │               ├── mocks/
        │               │   ├── MockDataSource.java
        │               │   ├── StubBaseConnection.java
        │               │   ├── StubConnection.java
        │               │   ├── StubDataSource.java
        │               │   ├── StubDriver.java
        │               │   ├── StubPoolStats.java
        │               │   ├── StubPreparedStatement.java
        │               │   ├── StubResultSet.java
        │               │   ├── StubStatement.java
        │               │   └── TestObject.java
        │               ├── osgi/
        │               │   └── OSGiBundleTest.java
        │               ├── pool/
        │               │   ├── CodahaleMetricsTest.java
        │               │   ├── ConcurrentCloseConnectionTest.java
        │               │   ├── ConnectionPoolSizeVsThreadsTest.java
        │               │   ├── ConnectionRaceConditionTest.java
        │               │   ├── ConnectionStateTest.java
        │               │   ├── Dropwizard5MetricsTest.java
        │               │   ├── ExceptionTest.java
        │               │   ├── HouseKeeperCleanupTest.java
        │               │   ├── IsolationTest.java
        │               │   ├── JdbcDriverTest.java
        │               │   ├── MetricsTrackerTest.java
        │               │   ├── MiscTest.java
        │               │   ├── PostgresTest.java
        │               │   ├── RampUpDown.java
        │               │   ├── RequestBoundariesTest.java
        │               │   ├── ShutdownTest.java
        │               │   ├── StatementTest.java
        │               │   ├── TestConcurrentBag.java
        │               │   ├── TestConnectionCloseBlocking.java
        │               │   ├── TestConnectionTimeoutRetry.java
        │               │   ├── TestConnections.java
        │               │   ├── TestCredentials.java
        │               │   ├── TestElf.java
        │               │   ├── TestHibernate.java
        │               │   ├── TestIsRunning.java
        │               │   ├── TestJNDI.java
        │               │   ├── TestJavassistCodegen.java
        │               │   ├── TestMBean.java
        │               │   ├── TestMetrics.java
        │               │   ├── TestMetricsBase.java
        │               │   ├── TestPropertySetter.java
        │               │   ├── TestProxies.java
        │               │   ├── TestSaturatedPool830.java
        │               │   ├── TestStates.java
        │               │   ├── TestValidation.java
        │               │   └── UnwrapTest.java
        │               └── util/
        │                   ├── ClockSourceTest.java
        │                   ├── DriverDataSourceTest.java
        │                   ├── PropertyElfTest.java
        │                   ├── TestFastList.java
        │                   ├── TomcatConcurrentBagLeakTest.java
        │                   └── UtilityElfTest.java
        └── resources/
            ├── duration-config.properties
            ├── hibernate.properties
            ├── log4j2-test.xml
            ├── postgres_init_script.sql
            ├── propfile1.properties
            ├── propfile2.properties
            └── propfile3.properties
Download .txt
SYMBOL INDEX (1539 symbols across 112 files)

FILE: src/main/java/com/zaxxer/hikari/HikariConfig.java
  class HikariConfig (line 44) | @SuppressWarnings({"SameParameterValue", "unused"})
    method HikariConfig (line 115) | public HikariConfig()
    method HikariConfig (line 141) | public HikariConfig(Properties properties)
    method HikariConfig (line 154) | public HikariConfig(String propertyFileName)
    method getCatalog (line 166) | @Override
    method setCatalog (line 173) | @Override
    method getConnectionTimeout (line 181) | @Override
    method setConnectionTimeout (line 188) | @Override
    method getIdleTimeout (line 203) | @Override
    method setIdleTimeout (line 210) | @Override
    method getLeakDetectionThreshold (line 220) | @Override
    method setLeakDetectionThreshold (line 227) | @Override
    method getMaxLifetime (line 234) | @Override
    method setMaxLifetime (line 241) | @Override
    method getMaximumPoolSize (line 248) | @Override
    method setMaximumPoolSize (line 255) | @Override
    method getMinimumIdle (line 265) | @Override
    method setMinimumIdle (line 272) | @Override
    method getPassword (line 285) | public String getPassword()
    method setPassword (line 294) | @Override
    method getUsername (line 305) | public String getUsername()
    method setUsername (line 315) | @Override
    method setCredentials (line 326) | @Override
    method getCredentials (line 337) | public Credentials getCredentials()
    method getValidationTimeout (line 343) | @Override
    method setValidationTimeout (line 350) | @Override
    method getConnectionTestQuery (line 369) | public String getConnectionTestQuery()
    method setConnectionTestQuery (line 381) | public void setConnectionTestQuery(String connectionTestQuery)
    method getConnectionInitSql (line 393) | public String getConnectionInitSql()
    method setConnectionInitSql (line 405) | public void setConnectionInitSql(String connectionInitSql)
    method getDataSource (line 417) | public DataSource getDataSource()
    method setDataSource (line 428) | public void setDataSource(DataSource dataSource)
    method getDataSourceClassName (line 439) | public String getDataSourceClassName()
    method setDataSourceClassName (line 449) | public void setDataSourceClassName(String className)
    method addDataSourceProperty (line 468) | public void addDataSourceProperty(String propertyName, Object value)
    method getDataSourceJNDI (line 474) | public String getDataSourceJNDI()
    method setDataSourceJNDI (line 479) | public void setDataSourceJNDI(String jndiDataSource)
    method getDataSourceProperties (line 485) | public Properties getDataSourceProperties()
    method setDataSourceProperties (line 490) | public void setDataSourceProperties(Properties dsProperties)
    method getDriverClassName (line 496) | public String getDriverClassName()
    method setDriverClassName (line 501) | public void setDriverClassName(String driverClassName)
    method getJdbcUrl (line 514) | public String getJdbcUrl()
    method setJdbcUrl (line 519) | public void setJdbcUrl(String jdbcUrl)
    method isAutoCommit (line 530) | public boolean isAutoCommit()
    method setAutoCommit (line 540) | public void setAutoCommit(boolean isAutoCommit)
    method isAllowPoolSuspension (line 551) | public boolean isAllowPoolSuspension()
    method setAllowPoolSuspension (line 563) | public void setAllowPoolSuspension(boolean isAllowPoolSuspension)
    method getInitializationFailTimeout (line 576) | public long getInitializationFailTimeout()
    method setInitializationFailTimeout (line 614) | public void setInitializationFailTimeout(long initializationFailTimeout)
    method isIsolateInternalQueries (line 626) | public boolean isIsolateInternalQueries()
    method setIsolateInternalQueries (line 637) | public void setIsolateInternalQueries(boolean isolate)
    method getMetricsTrackerFactory (line 643) | public MetricsTrackerFactory getMetricsTrackerFactory()
    method setMetricsTrackerFactory (line 648) | public void setMetricsTrackerFactory(MetricsTrackerFactory metricsTrac...
    method getMetricRegistry (line 662) | public Object getMetricRegistry()
    method setMetricRegistry (line 672) | public void setMetricRegistry(Object metricRegistry)
    method getHealthCheckRegistry (line 698) | public Object getHealthCheckRegistry()
    method setHealthCheckRegistry (line 709) | public void setHealthCheckRegistry(Object healthCheckRegistry)
    method getHealthCheckProperties (line 724) | public Properties getHealthCheckProperties()
    method setHealthCheckProperties (line 729) | public void setHealthCheckProperties(Properties healthCheckProperties)
    method addHealthCheckProperty (line 735) | public void addHealthCheckProperty(String key, String value)
    method getKeepaliveTime (line 747) | public long getKeepaliveTime() {
    method setKeepaliveTime (line 757) | public void setKeepaliveTime(long keepaliveTimeMs) {
    method isReadOnly (line 766) | public boolean isReadOnly()
    method setReadOnly (line 776) | public void setReadOnly(boolean readOnly)
    method isRegisterMbeans (line 788) | public boolean isRegisterMbeans()
    method setRegisterMbeans (line 798) | public void setRegisterMbeans(boolean register)
    method getPoolName (line 805) | @Override
    method setPoolName (line 817) | public void setPoolName(String poolName)
    method getScheduledExecutor (line 828) | public ScheduledExecutorService getScheduledExecutor()
    method setScheduledExecutor (line 838) | public void setScheduledExecutor(ScheduledExecutorService executor)
    method getTransactionIsolation (line 844) | public String getTransactionIsolation()
    method getSchema (line 854) | public String getSchema()
    method setSchema (line 864) | public void setSchema(String schema)
    method getCredentialsProviderClassName (line 876) | public String getCredentialsProviderClassName()
    method setCredentialsProviderClassName (line 888) | public void setCredentialsProviderClassName(String credentialsProvider...
    method getCredentialsProvider (line 907) | public HikariCredentialsProvider getCredentialsProvider() {
    method setCredentialsProvider (line 918) | public void setCredentialsProvider(HikariCredentialsProvider credentia...
    method getExceptionOverrideClassName (line 929) | public String getExceptionOverrideClassName()
    method setExceptionOverrideClassName (line 940) | public void setExceptionOverrideClassName(String exceptionOverrideClas...
    method getExceptionOverride (line 960) | public SQLExceptionOverride getExceptionOverride()
    method setExceptionOverride (line 971) | public void setExceptionOverride(SQLExceptionOverride exceptionOverrid...
    method setTransactionIsolation (line 983) | public void setTransactionIsolation(String isolationLevel)
    method getThreadFactory (line 994) | public ThreadFactory getThreadFactory()
    method setThreadFactory (line 1004) | public void setThreadFactory(ThreadFactory threadFactory)
    method seal (line 1010) | void seal()
    method copyStateTo (line 1020) | @SuppressWarnings({"rawtypes", "unchecked"})
    method validate (line 1044) | @SuppressWarnings("StatementWithEmptyBody")
    method validateNumerics (line 1101) | private void validateNumerics()
    method checkIfSealed (line 1154) | private void checkIfSealed()
    method logConfiguration (line 1159) | private void logConfiguration()
    method loadProperties (line 1201) | private void loadProperties(String propertyFileName)
    method openPropertiesInputStream (line 1218) | private InputStream openPropertiesInputStream(String propertyFileName)...
    method generatePoolName (line 1230) | private String generatePoolName()
    method getObjectOrPerformJndiLookup (line 1256) | private Object getObjectOrPerformJndiLookup(Object object)

FILE: src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java
  type HikariConfigMXBean (line 26) | public interface HikariConfigMXBean
    method getConnectionTimeout (line 35) | long getConnectionTimeout();
    method setConnectionTimeout (line 44) | void setConnectionTimeout(long connectionTimeoutMs);
    method getValidationTimeout (line 52) | long getValidationTimeout();
    method setValidationTimeout (line 60) | void setValidationTimeout(long validationTimeoutMs);
    method getIdleTimeout (line 70) | long getIdleTimeout();
    method setIdleTimeout (line 80) | void setIdleTimeout(long idleTimeoutMs);
    method getLeakDetectionThreshold (line 88) | long getLeakDetectionThreshold();
    method setLeakDetectionThreshold (line 96) | void setLeakDetectionThreshold(long leakDetectionThresholdMs);
    method getMaxLifetime (line 105) | long getMaxLifetime();
    method setMaxLifetime (line 114) | void setMaxLifetime(long maxLifetimeMs);
    method getMinimumIdle (line 123) | int getMinimumIdle();
    method setMinimumIdle (line 132) | void setMinimumIdle(int minIdle);
    method getMaximumPoolSize (line 140) | int getMaximumPoolSize();
    method setMaximumPoolSize (line 152) | void setMaximumPoolSize(int maxPoolSize);
    method setPassword (line 161) | void setPassword(String password);
    method setUsername (line 170) | void setUsername(String username);
    method setCredentials (line 179) | void setCredentials(Credentials credentials);
    method getPoolName (line 186) | String getPoolName();
    method getCatalog (line 193) | String getCatalog();
    method setCatalog (line 202) | void setCatalog(String catalog);

FILE: src/main/java/com/zaxxer/hikari/HikariCredentialsProvider.java
  type HikariCredentialsProvider (line 26) | public interface HikariCredentialsProvider {
    method getCredentials (line 32) | Credentials getCredentials();

FILE: src/main/java/com/zaxxer/hikari/HikariDataSource.java
  class HikariDataSource (line 40) | public class HikariDataSource extends HikariConfig implements DataSource...
    method HikariDataSource (line 59) | public HikariDataSource()
    method HikariDataSource (line 74) | public HikariDataSource(HikariConfig configuration)
    method getConnection (line 91) | @Override
    method getConnection (line 131) | @Override
    method getLogWriter (line 138) | @Override
    method setLogWriter (line 146) | @Override
    method setLoginTimeout (line 156) | @Override
    method getLoginTimeout (line 166) | @Override
    method getParentLogger (line 174) | @Override
    method unwrap (line 181) | @Override
    method isWrapperFor (line 205) | @Override
    method setMetricRegistry (line 232) | @Override
    method setMetricsTrackerFactory (line 250) | @Override
    method setHealthCheckRegistry (line 268) | @Override
    method isRunning (line 294) | public boolean isRunning()
    method getHikariPoolMXBean (line 306) | public HikariPoolMXBean getHikariPoolMXBean()
    method getHikariConfigMXBean (line 316) | public HikariConfigMXBean getHikariConfigMXBean()
    method evictConnection (line 328) | public void evictConnection(Connection connection)
    method close (line 339) | @Override
    method isClosed (line 365) | public boolean isClosed()
    method toString (line 371) | @Override

FILE: src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java
  class HikariJNDIFactory (line 32) | public class HikariJNDIFactory implements ObjectFactory
    method getObjectInstance (line 34) | @Override
    method createDataSource (line 56) | private DataSource createDataSource(final Properties properties, final...
    method lookupJndiDataSource (line 66) | private DataSource lookupJndiDataSource(final Properties properties, f...

FILE: src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java
  type HikariPoolMXBean (line 26) | public interface HikariPoolMXBean
    method getIdleConnections (line 38) | int getIdleConnections();
    method getActiveConnections (line 50) | int getActiveConnections();
    method getTotalConnections (line 58) | int getTotalConnections();
    method getThreadsAwaitingConnection (line 66) | int getThreadsAwaitingConnection();
    method softEvictConnections (line 72) | void softEvictConnections();
    method suspendPool (line 81) | void suspendPool();
    method resumePool (line 90) | void resumePool();

FILE: src/main/java/com/zaxxer/hikari/SQLExceptionOverride.java
  type SQLExceptionOverride (line 34) | public interface SQLExceptionOverride {
    type Override (line 35) | enum Override {
    method adjudicate (line 47) | default Override adjudicate(final SQLException sqlException)

FILE: src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java
  class HikariConfigurationUtil (line 31) | public class HikariConfigurationUtil
    method loadConfiguration (line 42) | @SuppressWarnings("rawtypes")
    method copyProperty (line 63) | @SuppressWarnings("rawtypes")

FILE: src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java
  class HikariConnectionProvider (line 42) | public class HikariConnectionProvider implements ConnectionProvider, Con...
    method HikariConnectionProvider (line 65) | public HikariConnectionProvider()
    method configure (line 79) | @SuppressWarnings("rawtypes")
    method getConnection (line 101) | @Override
    method closeConnection (line 112) | @Override
    method supportsAggressiveRelease (line 118) | @Override
    method isUnwrappableAs (line 124) | @Override
    method unwrap (line 131) | @Override
    method stop (line 151) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/IMetricsTracker.java
  type IMetricsTracker (line 22) | public interface IMetricsTracker extends AutoCloseable
    method recordConnectionCreatedMillis (line 24) | default void recordConnectionCreatedMillis(long connectionCreatedMilli...
    method recordConnectionAcquiredNanos (line 26) | default void recordConnectionAcquiredNanos(final long elapsedAcquiredN...
    method recordConnectionUsageMillis (line 28) | default void recordConnectionUsageMillis(final long elapsedBorrowedMil...
    method recordConnectionTimeout (line 30) | default void recordConnectionTimeout() {}
    method close (line 32) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java
  class MetricsTracker (line 24) | @Deprecated

FILE: src/main/java/com/zaxxer/hikari/metrics/MetricsTrackerFactory.java
  type MetricsTrackerFactory (line 19) | public interface MetricsTrackerFactory
    method create (line 28) | IMetricsTracker create(String poolName, PoolStats poolStats);

FILE: src/main/java/com/zaxxer/hikari/metrics/PoolStats.java
  class PoolStats (line 28) | public abstract class PoolStats
    method PoolStats (line 40) | public PoolStats(final long timeoutMs)
    method getTotalConnections (line 46) | public int getTotalConnections()
    method getIdleConnections (line 55) | public int getIdleConnections()
    method getActiveConnections (line 64) | public int getActiveConnections()
    method getPendingThreads (line 73) | public int getPendingThreads()
    method getMaxConnections (line 82) | public int getMaxConnections() {
    method getMinConnections (line 90) | public int getMinConnections() {
    method update (line 98) | protected abstract void update();
    method shouldLoad (line 100) | private boolean shouldLoad()

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodaHaleMetricsTracker.java
  class CodaHaleMetricsTracker (line 41) | public final class CodaHaleMetricsTracker implements IMetricsTracker
    method CodaHaleMetricsTracker (line 50) | CodaHaleMetricsTracker(final String poolName, final PoolStats poolStat...
    method close (line 79) | @Override
    method recordConnectionAcquiredNanos (line 95) | @Override
    method recordConnectionUsageMillis (line 102) | @Override
    method recordConnectionTimeout (line 108) | @Override
    method recordConnectionCreatedMillis (line 114) | @Override
    method getConnectionAcquisitionTimer (line 120) | public Timer getConnectionAcquisitionTimer()
    method getConnectionDurationHistogram (line 125) | public Histogram getConnectionDurationHistogram()
    method getConnectionCreationHistogram (line 130) | public Histogram getConnectionCreationHistogram()

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodahaleHealthChecker.java
  class CodahaleHealthChecker (line 45) | public final class CodahaleHealthChecker
    method registerHealthChecks (line 54) | public static void registerHealthChecks(final HikariPool pool, final H...
    method CodahaleHealthChecker (line 76) | private CodahaleHealthChecker()
    class ConnectivityHealthCheck (line 81) | private static class ConnectivityHealthCheck extends HealthCheck
      method ConnectivityHealthCheck (line 86) | ConnectivityHealthCheck(final HikariPool pool, final long checkTimeo...
      method check (line 93) | @Override
    class Connection99Percent (line 105) | private static class Connection99Percent extends HealthCheck
      method Connection99Percent (line 110) | Connection99Percent(final Timer waitTimer, final long expected99thPe...
      method check (line 117) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodahaleMetricsTrackerFactory.java
  class CodahaleMetricsTrackerFactory (line 24) | public final class CodahaleMetricsTrackerFactory implements MetricsTrack...
    method CodahaleMetricsTrackerFactory (line 28) | public CodahaleMetricsTrackerFactory(MetricRegistry registry)
    method getRegistry (line 33) | public MetricRegistry getRegistry()
    method create (line 38) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTracker.java
  class Dropwizard5MetricsTracker (line 41) | public class Dropwizard5MetricsTracker implements IMetricsTracker
    method Dropwizard5MetricsTracker (line 50) | Dropwizard5MetricsTracker(final String poolName, final PoolStats poolS...
    method close (line 79) | @Override
    method recordConnectionAcquiredNanos (line 95) | @Override
    method recordConnectionUsageMillis (line 102) | @Override
    method recordConnectionTimeout (line 108) | @Override
    method recordConnectionCreatedMillis (line 114) | @Override
    method getConnectionAcquisitionTimer (line 120) | public Timer getConnectionAcquisitionTimer()
    method getConnectionDurationHistogram (line 125) | public Histogram getConnectionDurationHistogram()
    method getConnectionCreationHistogram (line 130) | public Histogram getConnectionCreationHistogram()

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTrackerFactory.java
  class Dropwizard5MetricsTrackerFactory (line 24) | public class Dropwizard5MetricsTrackerFactory implements MetricsTrackerF...
    method Dropwizard5MetricsTrackerFactory (line 28) | public Dropwizard5MetricsTrackerFactory(final MetricRegistry registry)
    method getRegistry (line 33) | public MetricRegistry getRegistry()
    method create (line 38) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/dropwizard/DropwizardCommon.java
  class DropwizardCommon (line 17) | final class DropwizardCommon {
    method DropwizardCommon (line 18) | private DropwizardCommon()

FILE: src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java
  class MicrometerMetricsTracker (line 49) | @SuppressWarnings("ALL")
    method MicrometerMetricsTracker (line 90) | MicrometerMetricsTracker(final String poolName, final PoolStats poolSt...
    method recordConnectionAcquiredNanos (line 150) | @Override
    method recordConnectionUsageMillis (line 157) | @Override
    method recordConnectionTimeout (line 163) | @Override
    method recordConnectionCreatedMillis (line 169) | @Override
    method close (line 175) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTrackerFactory.java
  class MicrometerMetricsTrackerFactory (line 24) | public class MicrometerMetricsTrackerFactory implements MetricsTrackerFa...
    method MicrometerMetricsTrackerFactory (line 29) | public MicrometerMetricsTrackerFactory(MeterRegistry registry)
    method create (line 34) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollector.java
  class HikariCPCollector (line 40) | class HikariCPCollector extends Collector
    method collect (line 47) | @Override
    method add (line 66) | void add(String name, PoolStats poolStats)
    method remove (line 71) | void remove(String name)
    method createGauge (line 76) | private GaugeMetricFamily createGauge(String metric, String help,

FILE: src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTracker.java
  class PrometheusHistogramMetricsTracker (line 37) | class PrometheusHistogramMetricsTracker implements IMetricsTracker
    method registerHistogram (line 56) | private static Histogram registerHistogram(String name, String help, d...
    method PrometheusHistogramMetricsTracker (line 74) | PrometheusHistogramMetricsTracker(String poolName, CollectorRegistry c...
    method registerMetrics (line 84) | private void registerMetrics(CollectorRegistry collectorRegistry) {
    method recordConnectionAcquiredNanos (line 93) | @Override
    method recordConnectionUsageMillis (line 98) | @Override
    method recordConnectionCreatedMillis (line 103) | @Override
    method recordConnectionTimeout (line 108) | @Override
    method close (line 113) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerFactory.java
  class PrometheusHistogramMetricsTrackerFactory (line 37) | public class PrometheusHistogramMetricsTrackerFactory implements Metrics...
    method PrometheusHistogramMetricsTrackerFactory (line 49) | public PrometheusHistogramMetricsTrackerFactory() {
    method PrometheusHistogramMetricsTrackerFactory (line 59) | public PrometheusHistogramMetricsTrackerFactory(CollectorRegistry coll...
    method create (line 63) | @Override
    method registerCollector (line 70) | private void registerCollector(Collector collector, CollectorRegistry ...

FILE: src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java
  class PrometheusMetricsTracker (line 41) | class PrometheusMetricsTracker implements IMetricsTracker
    method PrometheusMetricsTracker (line 69) | PrometheusMetricsTracker(String poolName, CollectorRegistry collectorR...
    method registerMetrics (line 80) | private void registerMetrics(CollectorRegistry collectorRegistry)
    method recordConnectionAcquiredNanos (line 90) | @Override
    method recordConnectionUsageMillis (line 96) | @Override
    method recordConnectionCreatedMillis (line 102) | @Override
    method recordConnectionTimeout (line 108) | @Override
    method createSummary (line 114) | private static Summary createSummary(String name, String help)
    method close (line 128) | @Override

FILE: src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java
  class PrometheusMetricsTrackerFactory (line 43) | public class PrometheusMetricsTrackerFactory implements MetricsTrackerFa...
    type RegistrationStatus (line 52) | enum RegistrationStatus
    method PrometheusMetricsTrackerFactory (line 61) | public PrometheusMetricsTrackerFactory()
    method PrometheusMetricsTrackerFactory (line 72) | public PrometheusMetricsTrackerFactory(CollectorRegistry collectorRegi...
    method create (line 77) | @Override
    method registerCollector (line 85) | private void registerCollector(Collector collector, CollectorRegistry ...

FILE: src/main/java/com/zaxxer/hikari/pool/HikariPool.java
  class HikariPool (line 52) | public final class HikariPool extends PoolBase implements HikariPoolMXBe...
    method HikariPool (line 88) | public HikariPool(final HikariConfig config)
    method getConnection (line 140) | public Connection getConnection() throws SQLException
    method getConnection (line 152) | public Connection getConnection(final long hardTimeout) throws SQLExce...
    method shutdown (line 201) | public synchronized void shutdown() throws InterruptedException
    method evictConnection (line 262) | public void evictConnection(Connection connection)
    method setMetricRegistry (line 281) | public void setMetricRegistry(Object metricRegistry)
    method setMetricsTrackerFactory (line 305) | public void setMetricsTrackerFactory(MetricsTrackerFactory metricsTrac...
    method setHealthCheckRegistry (line 321) | public void setHealthCheckRegistry(Object healthCheckRegistry)
    method addBagItem (line 340) | @Override
    method getActiveConnections (line 352) | @Override
    method getIdleConnections (line 359) | @Override
    method getTotalConnections (line 366) | @Override
    method getThreadsAwaitingConnection (line 373) | @Override
    method softEvictConnections (line 380) | @Override
    method suspendPool (line 387) | @Override
    method resumePool (line 400) | @Override
    method logPoolState (line 419) | void logPoolState(String... prefix)
    method recycle (line 433) | @Override
    method closeConnection (line 457) | void closeConnection(final PoolEntry poolEntry, final String closureRe...
    method getPoolStateCounts (line 470) | @SuppressWarnings("unused")
    method createPoolEntry (line 485) | private PoolEntry createPoolEntry()
    method fillPool (line 525) | private synchronized void fillPool(final boolean isAfterAdd)
    method abortActiveConnections (line 545) | private void abortActiveConnections(final ExecutorService assassinExec...
    method checkFailFast (line 567) | private void checkFailFast()
    method throwPoolInitializationException (line 607) | private void throwPoolInitializationException(Throwable t)
    method softEvictConnection (line 626) | private boolean softEvictConnection(final PoolEntry poolEntry, final S...
    method initializeHouseKeepingExecutorService (line 644) | private ScheduledExecutorService initializeHouseKeepingExecutorService()
    method destroyHouseKeepingExecutorService (line 661) | private void destroyHouseKeepingExecutorService()
    method getPoolStats (line 673) | private PoolStats getPoolStats()
    method createTimeoutException (line 700) | private SQLException createTimeoutException(long startTime)
    class PoolEntryCreator (line 731) | private final class PoolEntryCreator implements Callable<Boolean>
      method PoolEntryCreator (line 735) | PoolEntryCreator()
      method PoolEntryCreator (line 740) | PoolEntryCreator(String loggingPrefix)
      method call (line 745) | @Override
      method shouldContinueCreating (line 784) | private synchronized boolean shouldContinueCreating() {
    class HouseKeeper (line 793) | private final class HouseKeeper implements Runnable
      method run (line 799) | @Override
    class MaxLifetimeTask (line 853) | private final class MaxLifetimeTask implements Runnable
      method MaxLifetimeTask (line 857) | MaxLifetimeTask(final PoolEntry poolEntry)
      method run (line 862) | public void run()
    class KeepaliveTask (line 870) | private final class KeepaliveTask implements Runnable
      method KeepaliveTask (line 874) | KeepaliveTask(final PoolEntry poolEntry)
      method run (line 879) | public void run()
    class PoolInitializationException (line 898) | public static class PoolInitializationException extends RuntimeException
      method PoolInitializationException (line 906) | public PoolInitializationException(Throwable t)

FILE: src/main/java/com/zaxxer/hikari/pool/PoolBase.java
  class PoolBase (line 54) | abstract class PoolBase
    method PoolBase (line 97) | PoolBase(final HikariConfig config)
    method toString (line 125) | @Override
    method recycle (line 131) | abstract void recycle(final PoolEntry poolEntry);
    method quietlyCloseConnection (line 137) | void quietlyCloseConnection(final Connection connection, final String ...
    method isConnectionDead (line 157) | boolean isConnectionDead(final Connection connection)
    method getLastConnectionFailure (line 194) | Throwable getLastConnectionFailure()
    method getUnwrappedDataSource (line 199) | public DataSource getUnwrappedDataSource()
    method newPoolEntry (line 208) | PoolEntry newPoolEntry(final boolean isEmptyPool) throws Exception
    method resetConnectionState (line 213) | void resetConnectionState(final Connection connection, final ProxyConn...
    method shutdownNetworkTimeoutExecutor (line 253) | void shutdownNetworkTimeoutExecutor()
    method getLoginTimeout (line 261) | long getLoginTimeout()
    method handleMBeans (line 279) | void handleMBeans(final HikariPool hikariPool, final boolean register)
    method initializeDataSource (line 321) | private void initializeDataSource()
    method newConnection (line 360) | private Connection newConnection(final boolean isEmptyPool) throws Exc...
    method setupConnection (line 416) | private void setupConnection(final Connection connection) throws Conne...
    method checkDriverSupport (line 463) | private void checkDriverSupport(final Connection connection) throws SQ...
    method checkValidationSupport (line 479) | private void checkValidationSupport(final Connection connection) throw...
    method checkDefaultIsolation (line 501) | private void checkDefaultIsolation(final Connection connection) throws...
    method setQueryTimeout (line 523) | private void setQueryTimeout(final Statement statement, final int time...
    method getAndSetNetworkTimeout (line 547) | private int getAndSetNetworkTimeout(final Connection connection, final...
    method setNetworkTimeout (line 582) | private void setNetworkTimeout(final Connection connection, final long...
    method executeSql (line 597) | private void executeSql(final Connection connection, final String sql,...
    method createNetworkTimeoutExecutor (line 616) | private void createNetworkTimeoutExecutor(final DataSource dataSource,...
    method setLoginTimeout (line 639) | private void setLoginTimeout(final DataSource dataSource)
    method stringFromResetBits (line 661) | private String stringFromResetBits(final int bits)
    method getCredentials (line 673) | private Credentials getCredentials()
    class ConnectionSetupException (line 690) | static class ConnectionSetupException extends Exception
      method ConnectionSetupException (line 694) | ConnectionSetupException(Throwable t)
    class SynchronousExecutor (line 704) | private static class SynchronousExecutor implements Executor
      method execute (line 707) | @Override
    type IMetricsTrackerDelegate (line 720) | interface IMetricsTrackerDelegate extends AutoCloseable
      method recordConnectionUsage (line 722) | default void recordConnectionUsage(PoolEntry poolEntry) {}
      method recordConnectionCreated (line 724) | default void recordConnectionCreated(long connectionCreatedMillis) {}
      method recordBorrowTimeoutStats (line 726) | default void recordBorrowTimeoutStats(long startTime) {}
      method recordBorrowStats (line 728) | default void recordBorrowStats(final PoolEntry poolEntry, final long...
      method recordConnectionTimeout (line 730) | default void recordConnectionTimeout() {}
      method close (line 732) | @Override
    class MetricsTrackerDelegate (line 741) | static class MetricsTrackerDelegate implements IMetricsTrackerDelegate
      method MetricsTrackerDelegate (line 745) | MetricsTrackerDelegate(IMetricsTracker tracker)
      method recordConnectionUsage (line 750) | @Override
      method recordConnectionCreated (line 756) | @Override
      method recordBorrowTimeoutStats (line 762) | @Override
      method recordBorrowStats (line 768) | @Override
      method recordConnectionTimeout (line 776) | @Override
      method close (line 781) | @Override
    class NopMetricsTrackerDelegate (line 792) | static final class NopMetricsTrackerDelegate implements IMetricsTracke...

FILE: src/main/java/com/zaxxer/hikari/pool/PoolEntry.java
  class PoolEntry (line 37) | final class PoolEntry implements IConcurrentBagEntry
    method PoolEntry (line 64) | PoolEntry(final Connection connection, final PoolBase pool, final bool...
    method recycle (line 77) | void recycle()
    method setFutureEol (line 90) | void setFutureEol(final ScheduledFuture<?> endOfLife)
    method setKeepalive (line 95) | public void setKeepalive(ScheduledFuture<?> keepalive) {
    method createProxyConnection (line 99) | Connection createProxyConnection(final ProxyLeakTask leakTask)
    method resetConnectionState (line 104) | void resetConnectionState(final ProxyConnection proxyConnection, final...
    method getPoolName (line 109) | String getPoolName()
    method isMarkedEvicted (line 114) | boolean isMarkedEvicted()
    method markEvicted (line 119) | void markEvicted()
    method evict (line 124) | void evict(final String closureReason)
    method getMillisSinceBorrowed (line 130) | long getMillisSinceBorrowed()
    method getPoolBase (line 135) | PoolBase getPoolBase()
    method toString (line 141) | @Override
    method getState (line 155) | @Override
    method compareAndSet (line 162) | @Override
    method setState (line 169) | @Override
    method close (line 175) | Connection close()
    method stateToString (line 194) | private String stateToString()

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java
  class ProxyCallableStatement (line 26) | public abstract class ProxyCallableStatement extends ProxyPreparedStatem...
    method ProxyCallableStatement (line 28) | protected ProxyCallableStatement(ProxyConnection connection, CallableS...

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java
  class ProxyConnection (line 37) | public abstract class ProxyConnection implements Connection
    method ProxyConnection (line 86) | protected ProxyConnection(final PoolEntry poolEntry,
    method toString (line 101) | @Override
    method getAutoCommitState (line 111) | final boolean getAutoCommitState()
    method getCatalogState (line 116) | final String getCatalogState()
    method getSchemaState (line 121) | final String getSchemaState()
    method getTransactionIsolationState (line 126) | final int getTransactionIsolationState()
    method getReadOnlyState (line 131) | final boolean getReadOnlyState()
    method getNetworkTimeoutState (line 136) | final int getNetworkTimeoutState()
    method getPoolEntry (line 145) | final PoolEntry getPoolEntry()
    method checkException (line 150) | @SuppressWarnings("ConstantConditions")
    method untrackStatement (line 188) | final synchronized void untrackStatement(final Statement statement)
    method markCommitStateDirty (line 193) | final void markCommitStateDirty()
    method cancelLeakTask (line 200) | void cancelLeakTask()
    method trackStatement (line 205) | private synchronized <T extends Statement> T trackStatement(final T st...
    method closeStatements (line 212) | @SuppressWarnings("EmptyTryBlock")
    method close (line 239) | @Override
    method isClosed (line 274) | @Override
    method createStatement (line 282) | @Override
    method createStatement (line 289) | @Override
    method createStatement (line 296) | @Override
    method prepareCall (line 304) | @Override
    method prepareCall (line 311) | @Override
    method prepareCall (line 318) | @Override
    method prepareStatement (line 325) | @Override
    method prepareStatement (line 332) | @Override
    method prepareStatement (line 339) | @Override
    method prepareStatement (line 346) | @Override
    method prepareStatement (line 353) | @Override
    method prepareStatement (line 360) | @Override
    method getMetaData (line 367) | @Override
    method commit (line 375) | @Override
    method rollback (line 383) | @Override
    method rollback (line 391) | @Override
    method getAutoCommit (line 399) | @Override
    method setAutoCommit (line 409) | @Override
    method isReadOnly (line 418) | @Override
    method setReadOnly (line 428) | @Override
    method getTransactionIsolation (line 437) | @Override
    method setTransactionIsolation (line 447) | @Override
    method getCatalog (line 456) | @Override
    method setCatalog (line 466) | @Override
    method getNetworkTimeout (line 475) | @Override
    method setNetworkTimeout (line 485) | @Override
    method getSchema (line 494) | @Override
    method setSchema (line 504) | @Override
    method isWrapperFor (line 513) | @Override
    method unwrap (line 520) | @Override
    class ClosedConnection (line 538) | private static final class ClosedConnection
      method getClosedConnection (line 542) | private static Connection getClosedConnection()

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyDatabaseMetaData.java
  class ProxyDatabaseMetaData (line 30) | public abstract class ProxyDatabaseMetaData implements DatabaseMetaData
    method ProxyDatabaseMetaData (line 37) | ProxyDatabaseMetaData(ProxyConnection connection, DatabaseMetaData met...
    method checkException (line 43) | final SQLException checkException(SQLException e)
    method toString (line 49) | @Override
    method getConnection (line 61) | @Override
    method getProcedures (line 67) | @Override
    method getProcedureColumns (line 77) | @Override
    method getTables (line 87) | @Override
    method getSchemas (line 97) | @Override
    method getCatalogs (line 107) | @Override
    method getTableTypes (line 117) | @Override
    method getColumns (line 127) | @Override
    method getColumnPrivileges (line 137) | @Override
    method getTablePrivileges (line 147) | @Override
    method getBestRowIdentifier (line 157) | @Override
    method getVersionColumns (line 167) | @Override
    method getPrimaryKeys (line 177) | @Override
    method getImportedKeys (line 187) | @Override
    method getExportedKeys (line 197) | @Override
    method getCrossReference (line 207) | @Override
    method getTypeInfo (line 217) | @Override
    method getIndexInfo (line 227) | @Override
    method getUDTs (line 237) | @Override
    method getSuperTypes (line 247) | @Override
    method getSuperTables (line 257) | @Override
    method getAttributes (line 267) | @Override
    method getSchemas (line 277) | @Override
    method getClientInfoProperties (line 287) | @Override
    method getFunctions (line 297) | @Override
    method getFunctionColumns (line 307) | @Override
    method getPseudoColumns (line 317) | @Override
    method isWrapperFor (line 328) | @Override
    method unwrap (line 335) | @Override

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java
  class ProxyFactory (line 29) | public final class ProxyFactory
    method ProxyFactory (line 31) | private ProxyFactory()
    method getProxyConnection (line 46) | static ProxyConnection getProxyConnection(final PoolEntry poolEntry, f...
    method getProxyStatement (line 52) | static Statement getProxyStatement(final ProxyConnection connection, f...
    method getProxyCallableStatement (line 58) | static CallableStatement getProxyCallableStatement(final ProxyConnecti...
    method getProxyPreparedStatement (line 64) | static PreparedStatement getProxyPreparedStatement(final ProxyConnecti...
    method getProxyResultSet (line 70) | static ResultSet getProxyResultSet(final ProxyConnection connection, f...
    method getProxyDatabaseMetaData (line 76) | static DatabaseMetaData getProxyDatabaseMetaData(final ProxyConnection...

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java
  class ProxyLeakTask (line 32) | class ProxyLeakTask implements Runnable
    method schedule (line 46) | @Override
    method run (line 49) | @Override
    method cancel (line 52) | @Override
    method ProxyLeakTask (line 57) | ProxyLeakTask(final PoolEntry poolEntry)
    method ProxyLeakTask (line 64) | private ProxyLeakTask()
    method schedule (line 68) | void schedule(ScheduledExecutorService executorService, long leakDetec...
    method run (line 74) | @Override
    method cancel (line 88) | void cancel()

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyLeakTaskFactory.java
  class ProxyLeakTaskFactory (line 27) | class ProxyLeakTaskFactory
    method ProxyLeakTaskFactory (line 32) | ProxyLeakTaskFactory(final long leakDetectionThreshold, final Schedule...
    method schedule (line 38) | ProxyLeakTask schedule(final PoolEntry poolEntry)
    method updateLeakDetectionThreshold (line 43) | void updateLeakDetectionThreshold(final long leakDetectionThreshold)
    method scheduleNewTask (line 48) | private ProxyLeakTask scheduleNewTask(PoolEntry poolEntry) {

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java
  class ProxyPreparedStatement (line 28) | public abstract class ProxyPreparedStatement extends ProxyStatement impl...
    method ProxyPreparedStatement (line 30) | ProxyPreparedStatement(ProxyConnection connection, PreparedStatement s...
    method execute (line 40) | @Override
    method executeQuery (line 48) | @Override
    method executeUpdate (line 57) | @Override
    method executeLargeUpdate (line 65) | @Override

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java
  class ProxyResultSet (line 29) | public abstract class ProxyResultSet implements ResultSet
    method ProxyResultSet (line 35) | protected ProxyResultSet(ProxyConnection connection, ProxyStatement st...
    method checkException (line 42) | final SQLException checkException(SQLException e)
    method toString (line 48) | @Override
    method getStatement (line 59) | @Override
    method updateRow (line 66) | @Override
    method insertRow (line 74) | @Override
    method deleteRow (line 82) | @Override
    method isWrapperFor (line 90) | @Override
    method unwrap (line 97) | @Override

FILE: src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java
  class ProxyStatement (line 30) | public abstract class ProxyStatement implements Statement
    method ProxyStatement (line 38) | ProxyStatement(ProxyConnection connection, Statement statement)
    method checkException (line 44) | final SQLException checkException(SQLException e)
    method toString (line 50) | @Override
    method close (line 62) | @Override
    method getConnection (line 84) | @Override
    method execute (line 91) | @Override
    method execute (line 99) | @Override
    method executeQuery (line 107) | @Override
    method executeUpdate (line 116) | @Override
    method executeBatch (line 124) | @Override
    method executeUpdate (line 132) | @Override
    method executeUpdate (line 140) | @Override
    method executeUpdate (line 148) | @Override
    method execute (line 156) | @Override
    method execute (line 164) | @Override
    method executeLargeBatch (line 172) | @Override
    method executeLargeUpdate (line 180) | @Override
    method executeLargeUpdate (line 188) | @Override
    method executeLargeUpdate (line 196) | @Override
    method executeLargeUpdate (line 204) | @Override
    method getResultSet (line 212) | @Override
    method getGeneratedKeys (line 227) | @Override
    method isWrapperFor (line 238) | @Override
    method unwrap (line 245) | @Override

FILE: src/main/java/com/zaxxer/hikari/util/ClockSource.java
  type ClockSource (line 36) | public interface ClockSource
    method currentTime (line 45) | static long currentTime() {
    method currentTime0 (line 49) | long currentTime0();
    method toMillis (line 58) | static long toMillis(long time) {
    method toMillis0 (line 62) | long toMillis0(long time);
    method toNanos (line 71) | static long toNanos(long time) {
    method toNanos0 (line 75) | long toNanos0(long time);
    method elapsedMillis (line 84) | static long elapsedMillis(long startTime) {
    method elapsedMillis0 (line 88) | long elapsedMillis0(long startTime);
    method elapsedMillis (line 98) | static long elapsedMillis(long startTime, long endTime) {
    method elapsedMillis0 (line 102) | long elapsedMillis0(long startTime, long endTime);
    method elapsedNanos (line 111) | static long elapsedNanos(long startTime) {
    method elapsedNanos0 (line 115) | long elapsedNanos0(long startTime);
    method elapsedNanos (line 125) | static long elapsedNanos(long startTime, long endTime) {
    method elapsedNanos0 (line 129) | long elapsedNanos0(long startTime, long endTime);
    method plusMillis (line 138) | static long plusMillis(long time, long millis) {
    method plusMillis0 (line 142) | long plusMillis0(long time, long millis);
    method getSourceTimeUnit (line 148) | static TimeUnit getSourceTimeUnit() {
    method getSourceTimeUnit0 (line 152) | TimeUnit getSourceTimeUnit0();
    method elapsedDisplayString (line 161) | static String elapsedDisplayString(long startTime, long endTime) {
    method elapsedDisplayString0 (line 165) | default String elapsedDisplayString0(long startTime, long endTime) {
    class Factory (line 190) | class Factory
      method create (line 192) | private static ClockSource create() {
    class MillisecondClockSource (line 208) | final class MillisecondClockSource implements ClockSource
      method currentTime0 (line 211) | @Override
      method elapsedMillis0 (line 217) | @Override
      method elapsedMillis0 (line 223) | @Override
      method elapsedNanos0 (line 229) | @Override
      method elapsedNanos0 (line 235) | @Override
      method toMillis0 (line 241) | @Override
      method toNanos0 (line 247) | @Override
      method plusMillis0 (line 253) | @Override
      method getSourceTimeUnit0 (line 259) | @Override
    class NanosecondClockSource (line 270) | class NanosecondClockSource implements ClockSource
      method currentTime0 (line 273) | @Override
      method toMillis0 (line 279) | @Override
      method toNanos0 (line 285) | @Override
      method elapsedMillis0 (line 291) | @Override
      method elapsedMillis0 (line 297) | @Override
      method elapsedNanos0 (line 303) | @Override
      method elapsedNanos0 (line 309) | @Override
      method plusMillis0 (line 315) | @Override
      method getSourceTimeUnit0 (line 321) | @Override

FILE: src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java
  class ConcurrentBag (line 60) | @SuppressWarnings("DuplicatedCode")
    type IConcurrentBagEntry (line 81) | public interface IConcurrentBagEntry
      method compareAndSet (line 88) | boolean compareAndSet(int expectState, int newState);
      method setState (line 89) | void setState(int newState);
      method getState (line 90) | int getState();
    type IBagStateListener (line 100) | public interface IBagStateListener
      method addBagItem (line 102) | void addBagItem(int waiting);
    method ConcurrentBag (line 110) | public ConcurrentBag(final IBagStateListener listener)
    method borrow (line 132) | public T borrow(long timeout, final TimeUnit timeUnit) throws Interrup...
    method requite (line 187) | public void requite(final T bagEntry)
    method add (line 214) | public void add(final T bagEntry)
    method remove (line 238) | public boolean remove(final T bagEntry)
    method close (line 258) | @Override
    method values (line 273) | public List<T> values(final int state)
    method values (line 288) | @SuppressWarnings("unchecked")
    method reserve (line 306) | public boolean reserve(final T bagEntry)
    method unreserve (line 317) | @SuppressWarnings("SpellCheckingInspection")
    method getWaitingThreadCount (line 345) | public int getWaitingThreadCount()
    method getCount (line 356) | public int getCount(final int state)
    method getStateCounts (line 367) | public int[] getStateCounts()
    method size (line 384) | public int size()
    method dumpState (line 389) | public void dumpState()
    method useWeakThreadLocals (line 401) | private boolean useWeakThreadLocals()

FILE: src/main/java/com/zaxxer/hikari/util/Credentials.java
  class Credentials (line 24) | public final class Credentials
    method of (line 37) | public static Credentials of(final String username, final String passw...
    method Credentials (line 47) | @ConstructorParameters({ "username", "password" })
    method getUsername (line 59) | public String getUsername()
    method getPassword (line 69) | public String getPassword()

FILE: src/main/java/com/zaxxer/hikari/util/DriverDataSource.java
  class DriverDataSource (line 40) | public final class DriverDataSource implements DataSource
    method DriverDataSource (line 50) | public DriverDataSource(String jdbcUrl, String driverClassName, Proper...
    method getConnection (line 124) | @Override
    method getConnection (line 130) | @Override
    method getLogWriter (line 147) | @Override
    method setLogWriter (line 153) | @Override
    method setLoginTimeout (line 159) | @Override
    method getLoginTimeout (line 165) | @Override
    method getParentLogger (line 171) | @Override
    method unwrap (line 177) | @Override
    method isWrapperFor (line 183) | @Override

FILE: src/main/java/com/zaxxer/hikari/util/FastList.java
  class FastList (line 39) | @SuppressWarnings("NullableProblems")
    method FastList (line 52) | @SuppressWarnings("unchecked")
    method FastList (line 64) | @SuppressWarnings("unchecked")
    method add (line 76) | @Override
    method get (line 102) | @Override
    method removeLast (line 115) | public T removeLast()
    method remove (line 129) | @Override
    method clear (line 149) | @Override
    method size (line 164) | @Override
    method isEmpty (line 171) | @Override
    method set (line 178) | @Override
    method remove (line 187) | @Override
    method contains (line 207) | @Override
    method iterator (line 214) | @Override
    method toArray (line 239) | @Override
    method toArray (line 246) | @Override
    method containsAll (line 253) | @Override
    method addAll (line 260) | @Override
    method addAll (line 267) | @Override
    method removeAll (line 274) | @Override
    method retainAll (line 281) | @Override
    method add (line 288) | @Override
    method indexOf (line 295) | @Override
    method lastIndexOf (line 302) | @Override
    method listIterator (line 309) | @Override
    method listIterator (line 316) | @Override
    method subList (line 323) | @Override
    method clone (line 330) | @Override
    method forEach (line 337) | @Override
    method spliterator (line 344) | @Override
    method removeIf (line 351) | @Override
    method replaceAll (line 358) | @Override
    method sort (line 365) | @Override

FILE: src/main/java/com/zaxxer/hikari/util/IsolationLevel.java
  type IsolationLevel (line 27) | public enum IsolationLevel
    method IsolationLevel (line 40) | IsolationLevel(int levelId) {
    method getLevelId (line 44) | public int getLevelId() {

FILE: src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java
  class JavassistProxyFactory (line 42) | public final class JavassistProxyFactory
    method main (line 47) | public static void main(String... args) throws Exception {
    method modifyProxyFactory (line 77) | private static void modifyProxyFactory() throws NotFoundException, Can...
    method generateProxyClass (line 114) | private static <T> void generateProxyClass(Class<T> primaryInterface, ...
    method isThrowsSqlException (line 188) | private static boolean isThrowsSqlException(CtMethod method)
    method isDefaultMethod (line 204) | private static boolean isDefaultMethod(Class<?> intf, CtMethod intfMet...
    method getAllInterfaces (line 215) | private static Set<Class<?>> getAllInterfaces(Class<?> clazz)
    method toJavaClass (line 235) | private static Class<?> toJavaClass(CtClass cls) throws Exception
    method toJavaClass (line 245) | private static Class<?> toJavaClass(String cn) throws Exception

FILE: src/main/java/com/zaxxer/hikari/util/PropertyElf.java
  class PropertyElf (line 33) | public final class PropertyElf
    method PropertyElf (line 39) | private PropertyElf() {
    method setTargetFromProperties (line 43) | public static void setTargetFromProperties(final Object target, final ...
    method getPropertyNames (line 67) | public static Set<String> getPropertyNames(final Class<?> targetClass)
    method getProperty (line 86) | public static Object getProperty(final String propName, final Object t...
    method copyProperties (line 106) | public static Properties copyProperties(final Properties props)
    method propertyNameFromGetterName (line 113) | private static String propertyNameFromGetterName(final String methodName)
    method setProperty (line 130) | private static void setProperty(final Object target, final String prop...
    method capitalizedPropertyName (line 192) | private static String capitalizedPropertyName(String propertyName)
    method parseIntArray (line 198) | private static int[] parseIntArray(String value)
    method parseStringArray (line 212) | private static String[] parseStringArray(String value)
    method parseDuration (line 246) | private static Optional<Duration> parseDuration(String value)

FILE: src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java
  class SuspendResumeLock (line 31) | public class SuspendResumeLock
    method acquire (line 34) | @Override
    method release (line 37) | @Override
    method suspend (line 40) | @Override
    method resume (line 43) | @Override
    method SuspendResumeLock (line 53) | public SuspendResumeLock()
    method SuspendResumeLock (line 58) | private SuspendResumeLock(final boolean createSemaphore)
    method acquire (line 63) | public void acquire() throws SQLException
    method release (line 75) | public void release()
    method suspend (line 80) | public void suspend()
    method resume (line 85) | public void resume()

FILE: src/main/java/com/zaxxer/hikari/util/UtilityElf.java
  class UtilityElf (line 41) | public final class UtilityElf
    method UtilityElf (line 51) | private UtilityElf()
    method maskPasswordInJdbcUrl (line 56) | public static String maskPasswordInJdbcUrl(String jdbcUrl)
    method getNullIfEmpty (line 67) | public static String getNullIfEmpty(final String text)
    method quietlySleep (line 77) | public static void quietlySleep(final long millis)
    method safeIsAssignableFrom (line 94) | public static boolean safeIsAssignableFrom(Object obj, String classNam...
    method createInstance (line 103) | public static <T> T createInstance(final String className, final Class...
    method createInstance (line 118) | public static <T> T createInstance(final String className, final Class...
    method createThreadPoolExecutor (line 168) | public static ThreadPoolExecutor createThreadPoolExecutor(final int qu...
    method createThreadPoolExecutor (line 182) | public static ThreadPoolExecutor createThreadPoolExecutor(final Blocki...
    method getTransactionIsolation (line 203) | public static int getTransactionIsolation(final String transactionIsol...
    class CustomDiscardPolicy (line 238) | public static class CustomDiscardPolicy implements RejectedExecutionHa...
      method rejectedExecution (line 240) | @Override
    class DefaultThreadFactory (line 251) | public static final class DefaultThreadFactory implements ThreadFactory
      method DefaultThreadFactory (line 256) | public DefaultThreadFactory(String threadName) {
      method newThread (line 261) | @Override
    method attemptFromContextLoader (line 274) | private static Class<?> attemptFromContextLoader(final String classNam...

FILE: src/test/java/com/zaxxer/hikari/HikariConfigTest.java
  class HikariConfigTest (line 39) | public class HikariConfigTest {
    method setup (line 42) | @Before
    method tearDown (line 47) | @After
    method getLoggerConfig (line 52) | private static LoggerConfig getLoggerConfig() {
    method testJdbcUrlLogging (line 58) | @Test
    method testJdbcUrl (line 76) | private void testJdbcUrl(String jdbcUrl) {
    class TestAppender (line 87) | private static class TestAppender extends AbstractAppender {
      method TestAppender (line 91) | TestAppender() {
      method append (line 95) | @Override
      method getLog (line 100) | String getLog() {

FILE: src/test/java/com/zaxxer/hikari/datasource/TestSealedConfig.java
  class TestSealedConfig (line 30) | public class TestSealedConfig
    method testSealed1 (line 32) | @Test(expected = IllegalStateException.class)
    method testSealed2 (line 44) | @Test(expected = IllegalStateException.class)
    method testSealed3 (line 58) | @Test(expected = IllegalStateException.class)
    method testSealedAccessibleMethods (line 72) | @Test

FILE: src/test/java/com/zaxxer/hikari/db/BasicPoolTest.java
  class BasicPoolTest (line 42) | public class BasicPoolTest
    method setup (line 44) | @Before
    method testIdleTimeout (line 67) | @Test
    method testIdleTimeout2 (line 109) | @Test

FILE: src/test/java/com/zaxxer/hikari/metrics/dropwizard/CodaHaleMetricsTrackerTest.java
  class CodaHaleMetricsTrackerTest (line 13) | @RunWith(MockitoJUnitRunner.class)
    method setup (line 22) | @Before
    method close (line 28) | @Test

FILE: src/test/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTrackerTest.java
  class Dropwizard5MetricsTrackerTest (line 13) | @RunWith(MockitoJUnitRunner.class)
    method setup (line 21) | @Before
    method close (line 27) | @Test

FILE: src/test/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTrackerTest.java
  class MicrometerMetricsTrackerTest (line 10) | public class MicrometerMetricsTrackerTest
    method setup (line 17) | @Before
    method close (line 23) | @Test

FILE: src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java
  class HikariCPCollectorTest (line 39) | public class HikariCPCollectorTest
    method setupCollectorRegistry (line 44) | @Before
    method noConnection (line 50) | @Test
    method noConnectionWithoutPoolName (line 72) | @Test
    method connection1 (line 95) | @Test
    method connectionClosed (line 121) | @Test
    method poolStatsRemovedAfterShutDown (line 147) | @Test
    method testHikariCPCollectorGaugesMetricsInitialization (line 181) | @Test
    method getValue (line 199) | private Double getValue(String name, String poolName)
    method poolStatsWithPredefinedValues (line 206) | private PoolStats poolStatsWithPredefinedValues()

FILE: src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerFactoryTest.java
  class PrometheusHistogramMetricsTrackerFactoryTest (line 16) | public class PrometheusHistogramMetricsTrackerFactoryTest {
    method registersToProvidedCollectorRegistry (line 18) | @Test
    method registersToDefaultCollectorRegistry (line 28) | @Test
    method clearCollectorRegistry (line 35) | @After
    method assertHikariMetricsArePresent (line 40) | private void assertHikariMetricsArePresent(CollectorRegistry collector...
    method assertHikariMetricsAreNotPresent (line 50) | private void assertHikariMetricsAreNotPresent(CollectorRegistry collec...
    method toMetricNames (line 60) | private List<String> toMetricNames(Enumeration<Collector.MetricFamilyS...
    method poolStats (line 68) | private PoolStats poolStats() {

FILE: src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerTest.java
  class PrometheusHistogramMetricsTrackerTest (line 33) | public class PrometheusHistogramMetricsTrackerTest {
    method setupCollectorRegistry (line 41) | @Before
    method recordConnectionTimeout (line 47) | @Test
    method connectionAcquisitionMetrics (line 74) | @Test
    method connectionUsageMetrics (line 79) | @Test
    method connectionCreationMetrics (line 84) | @Test
    method testMultiplePoolNameWithOneCollectorRegistry (line 89) | @Test
    method testMultiplePoolNameWithDifferentCollectorRegistries (line 122) | @Test
    method checkSummaryMetricFamily (line 155) | private void checkSummaryMetricFamily(String metricName) {

FILE: src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactoryTest.java
  class PrometheusMetricsTrackerFactoryTest (line 16) | public class PrometheusMetricsTrackerFactoryTest
    method clearCollectorRegistry (line 19) | @After
    method registersToProvidedCollectorRegistry (line 25) | @Test
    method registersToDefaultCollectorRegistry (line 35) | @Test
    method assertHikariMetricsArePresent (line 43) | private void assertHikariMetricsArePresent(CollectorRegistry collector...
    method assertHikariMetricsAreNotPresent (line 54) | private void assertHikariMetricsAreNotPresent(CollectorRegistry collec...
    method toMetricNames (line 65) | private List<String> toMetricNames(Enumeration<Collector.MetricFamilyS...

FILE: src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java
  class PrometheusMetricsTrackerTest (line 36) | public class PrometheusMetricsTrackerTest
    method setupCollectorRegistry (line 48) | @Before
    method recordConnectionTimeout (line 55) | @Test
    method connectionAcquisitionMetrics (line 81) | @Test
    method connectionUsageMetrics (line 87) | @Test
    method connectionCreationMetrics (line 93) | @Test
    method testMultiplePoolNameWithOneCollectorRegistry (line 99) | @Test
    method testMultiplePoolNameWithDifferentCollectorRegistries (line 132) | @Test
    method testMetricsRemovedAfterShutDown (line 165) | @Test
    method testCloseMethod (line 205) | @Test
    method checkSummaryMetricFamily (line 274) | private void checkSummaryMetricFamily(String metricName)

FILE: src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java
  class MockDataSource (line 45) | public class MockDataSource implements DataSource
    method getConnection (line 47) | @Override
    method getConnection (line 53) | @Override
    method getLogWriter (line 59) | @Override
    method setLogWriter (line 65) | @Override
    method setLoginTimeout (line 70) | @Override
    method getLoginTimeout (line 75) | @Override
    method getParentLogger (line 81) | public Logger getParentLogger() throws SQLFeatureNotSupportedException
    method unwrap (line 86) | @Override
    method isWrapperFor (line 92) | @Override
    method createMockConnection (line 98) | public static Connection createMockConnection() throws SQLException {

FILE: src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java
  class StubBaseConnection (line 24) | public abstract class StubBaseConnection implements Connection
    method createStatement (line 29) | @Override
    method prepareStatement (line 39) | @Override

FILE: src/test/java/com/zaxxer/hikari/mocks/StubConnection.java
  class StubConnection (line 46) | public class StubConnection extends StubBaseConnection
    method StubConnection (line 70) | public StubConnection() {
    method StubConnection (line 77) | public StubConnection(long waitTimeout) {
    method unwrap (line 93) | @SuppressWarnings("unchecked")
    method isWrapperFor (line 109) | @Override
    method prepareCall (line 119) | @Override
    method nativeSQL (line 129) | @Override
    method setAutoCommit (line 136) | @Override
    method getAutoCommit (line 146) | @Override
    method commit (line 156) | @Override
    method refreshConnectionWaitTimeout (line 162) | private void refreshConnectionWaitTimeout() throws SQLException {
    method rollback (line 177) | @Override
    method close (line 184) | @Override
    method isClosed (line 191) | @Override
    method getMetaData (line 201) | @Override
    method setReadOnly (line 208) | @Override
    method isReadOnly (line 217) | @Override
    method setCatalog (line 227) | @Override
    method getCatalog (line 237) | @Override
    method setTransactionIsolation (line 247) | @Override
    method getTransactionIsolation (line 257) | @Override
    method getWarnings (line 267) | @Override
    method clearWarnings (line 274) | @Override
    method createStatement (line 283) | @Override
    method prepareStatement (line 293) | @Override
    method prepareCall (line 303) | @Override
    method getTypeMap (line 313) | @Override
    method setTypeMap (line 320) | @Override
    method setHoldability (line 326) | @Override
    method getHoldability (line 332) | @Override
    method setSavepoint (line 339) | @Override
    method setSavepoint (line 346) | @Override
    method rollback (line 353) | @Override
    method releaseSavepoint (line 359) | @Override
    method createStatement (line 365) | @Override
    method prepareStatement (line 375) | @Override
    method prepareCall (line 385) | @Override
    method prepareStatement (line 395) | @Override
    method prepareStatement (line 405) | @Override
    method prepareStatement (line 415) | @Override
    method createClob (line 425) | @Override
    method createBlob (line 432) | @Override
    method createNClob (line 439) | @Override
    method createSQLXML (line 446) | @Override
    method isValid (line 453) | @Override
    method setClientInfo (line 464) | @Override
    method setClientInfo (line 470) | @Override
    method getClientInfo (line 476) | @Override
    method getClientInfo (line 483) | @Override
    method createArrayOf (line 490) | @Override
    method createStruct (line 497) | @Override
    method setSchema (line 504) | public void setSchema(String schema) throws SQLException
    method getSchema (line 513) | public String getSchema() throws SQLException
    method abort (line 522) | public void abort(Executor executor) throws SQLException
    method setNetworkTimeout (line 528) | public void setNetworkTimeout(Executor executor, int milliseconds) thr...
    method getNetworkTimeout (line 547) | public int getNetworkTimeout() throws SQLException
    method beginRequest (line 560) | @Override
    method endRequest (line 565) | @Override

FILE: src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java
  class StubDataSource (line 33) | public class StubDataSource implements DataSource
    method getUser (line 43) | public String getUser()
    method setUser (line 48) | public void setUser(String user)
    method getPassword (line 53) | public String getPassword()
    method setPassword (line 58) | public void setPassword(String password)
    method getWaitTimeout (line 63) | public int getWaitTimeout() {
    method setWaitTimeout (line 67) | public void setWaitTimeout(int waitTimeout) {
    method setURL (line 71) | public void setURL(String url)
    method getLogWriter (line 77) | @Override
    method setLogWriter (line 84) | @Override
    method setLoginTimeout (line 91) | @Override
    method getLoginTimeout (line 98) | @Override
    method getParentLogger (line 105) | public Logger getParentLogger() throws SQLFeatureNotSupportedException
    method unwrap (line 111) | @SuppressWarnings("unchecked")
    method isWrapperFor (line 123) | @Override
    method getConnection (line 130) | @Override
    method getConnection (line 143) | @Override
    method setThrowException (line 149) | public void setThrowException(SQLException e)
    method setConnectionAcquisitionTime (line 154) | public void setConnectionAcquisitionTime(long connectionAcquisitionTim...

FILE: src/test/java/com/zaxxer/hikari/mocks/StubDriver.java
  class StubDriver (line 32) | public class StubDriver implements Driver
    method connect (line 50) | @Override
    method acceptsURL (line 57) | @Override
    method getPropertyInfo (line 64) | @Override
    method getMajorVersion (line 71) | @Override
    method getMinorVersion (line 78) | @Override
    method jdbcCompliant (line 85) | @Override
    method getParentLogger (line 92) | public Logger getParentLogger() throws SQLFeatureNotSupportedException

FILE: src/test/java/com/zaxxer/hikari/mocks/StubPoolStats.java
  class StubPoolStats (line 5) | public class StubPoolStats extends PoolStats
    method StubPoolStats (line 8) | public StubPoolStats(long timeoutMs)
    method update (line 13) | @Override

FILE: src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java
  class StubPreparedStatement (line 46) | @SuppressWarnings("RedundantThrows")
    method StubPreparedStatement (line 49) | StubPreparedStatement(Connection connection)
    method executeQuery (line 55) | @Override
    method executeUpdate (line 62) | @Override
    method getMaxFieldSize (line 69) | @Override
    method setMaxFieldSize (line 76) | @Override
    method getMaxRows (line 82) | @Override
    method setMaxRows (line 89) | @Override
    method setEscapeProcessing (line 95) | @Override
    method getQueryTimeout (line 101) | @Override
    method setQueryTimeout (line 108) | @Override
    method cancel (line 114) | @Override
    method getWarnings (line 120) | @Override
    method clearWarnings (line 127) | @Override
    method setCursorName (line 133) | @Override
    method execute (line 139) | @Override
    method getResultSet (line 146) | @Override
    method getUpdateCount (line 153) | @Override
    method getMoreResults (line 160) | @Override
    method setFetchDirection (line 171) | @Override
    method getFetchDirection (line 177) | @Override
    method setFetchSize (line 184) | @Override
    method getFetchSize (line 190) | @Override
    method getResultSetConcurrency (line 197) | @Override
    method getResultSetType (line 204) | @Override
    method addBatch (line 211) | @Override
    method clearBatch (line 217) | @Override
    method executeBatch (line 223) | @Override
    method getMoreResults (line 230) | @Override
    method getGeneratedKeys (line 237) | @Override
    method executeUpdate (line 244) | @Override
    method executeUpdate (line 251) | @Override
    method executeUpdate (line 258) | @Override
    method execute (line 265) | @Override
    method execute (line 272) | @Override
    method execute (line 279) | @Override
    method getResultSetHoldability (line 286) | @Override
    method setPoolable (line 293) | @Override
    method isPoolable (line 299) | @Override
    method closeOnCompletion (line 306) | @Override
    method isCloseOnCompletion (line 312) | @Override
    method unwrap (line 319) | @SuppressWarnings("unchecked")
    method isWrapperFor (line 331) | @Override
    method executeQuery (line 338) | @Override
    method executeUpdate (line 345) | @Override
    method setNull (line 352) | @Override
    method setBoolean (line 358) | @Override
    method setByte (line 364) | @Override
    method setShort (line 370) | @Override
    method setInt (line 376) | @Override
    method setLong (line 382) | @Override
    method setFloat (line 388) | @Override
    method setDouble (line 394) | @Override
    method setBigDecimal (line 400) | @Override
    method setString (line 406) | @Override
    method setBytes (line 412) | @Override
    method setDate (line 418) | @Override
    method setTime (line 424) | @Override
    method setTimestamp (line 430) | @Override
    method setAsciiStream (line 436) | @Override
    method setUnicodeStream (line 442) | @Override
    method setBinaryStream (line 449) | @Override
    method clearParameters (line 455) | @Override
    method setObject (line 461) | @Override
    method setObject (line 467) | @Override
    method execute (line 473) | @Override
    method addBatch (line 480) | @Override
    method setCharacterStream (line 486) | @Override
    method setRef (line 492) | @Override
    method setBlob (line 498) | @Override
    method setClob (line 504) | @Override
    method setArray (line 510) | @Override
    method getMetaData (line 516) | @Override
    method setDate (line 523) | @Override
    method setTime (line 529) | @Override
    method setTimestamp (line 535) | @Override
    method setNull (line 541) | @Override
    method setURL (line 547) | @Override
    method getParameterMetaData (line 553) | @Override
    method setRowId (line 560) | @Override
    method setNString (line 566) | @Override
    method setNCharacterStream (line 572) | @Override
    method setNClob (line 578) | @Override
    method setClob (line 584) | @Override
    method setBlob (line 590) | @Override
    method setNClob (line 596) | @Override
    method setSQLXML (line 602) | @Override
    method setObject (line 608) | @Override
    method setAsciiStream (line 614) | @Override
    method setBinaryStream (line 620) | @Override
    method setCharacterStream (line 626) | @Override
    method setAsciiStream (line 632) | @Override
    method setBinaryStream (line 638) | @Override
    method setCharacterStream (line 644) | @Override
    method setNCharacterStream (line 650) | @Override
    method setClob (line 656) | @Override
    method setBlob (line 662) | @Override
    method setNClob (line 668) | @Override

FILE: src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java
  class StubResultSet (line 45) | @SuppressWarnings("RedundantThrows")
    method unwrap (line 52) | @Override
    method isWrapperFor (line 60) | @Override
    method next (line 67) | @Override
    method close (line 74) | @Override
    method wasNull (line 81) | @Override
    method getString (line 88) | @Override
    method getBoolean (line 95) | @Override
    method getByte (line 102) | @Override
    method getShort (line 109) | @Override
    method getInt (line 116) | @Override
    method getLong (line 123) | @Override
    method getFloat (line 130) | @Override
    method getDouble (line 137) | @Override
    method getBigDecimal (line 144) | @Override
    method getBytes (line 152) | @Override
    method getDate (line 159) | @Override
    method getTime (line 166) | @Override
    method getTimestamp (line 173) | @Override
    method getAsciiStream (line 180) | @Override
    method getUnicodeStream (line 187) | @Override
    method getBinaryStream (line 195) | @Override
    method getString (line 202) | @Override
    method getBoolean (line 209) | @Override
    method getByte (line 216) | @Override
    method getShort (line 223) | @Override
    method getInt (line 230) | @Override
    method getLong (line 237) | @Override
    method getFloat (line 244) | @Override
    method getDouble (line 251) | @Override
    method getBigDecimal (line 258) | @Override
    method getBytes (line 266) | @Override
    method getDate (line 273) | @Override
    method getTime (line 280) | @Override
    method getTimestamp (line 287) | @Override
    method getAsciiStream (line 294) | @Override
    method getUnicodeStream (line 301) | @Override
    method getBinaryStream (line 309) | @Override
    method getWarnings (line 316) | @Override
    method clearWarnings (line 323) | @Override
    method getCursorName (line 329) | @Override
    method getMetaData (line 336) | @Override
    method getObject (line 343) | @Override
    method getObject (line 350) | @Override
    method findColumn (line 357) | @Override
    method getCharacterStream (line 364) | @Override
    method getCharacterStream (line 371) | @Override
    method getBigDecimal (line 378) | @Override
    method getBigDecimal (line 385) | @Override
    method isBeforeFirst (line 392) | @Override
    method isAfterLast (line 399) | @Override
    method isFirst (line 406) | @Override
    method isLast (line 413) | @Override
    method beforeFirst (line 420) | @Override
    method afterLast (line 426) | @Override
    method first (line 432) | @Override
    method last (line 439) | @Override
    method getRow (line 446) | @Override
    method absolute (line 453) | @Override
    method relative (line 460) | @Override
    method previous (line 467) | @Override
    method setFetchDirection (line 474) | @Override
    method getFetchDirection (line 480) | @Override
    method setFetchSize (line 487) | @Override
    method getFetchSize (line 493) | @Override
    method getType (line 500) | @Override
    method getConcurrency (line 507) | @Override
    method rowUpdated (line 514) | @Override
    method rowInserted (line 521) | @Override
    method rowDeleted (line 528) | @Override
    method updateNull (line 535) | @Override
    method updateBoolean (line 541) | @Override
    method updateByte (line 547) | @Override
    method updateShort (line 553) | @Override
    method updateInt (line 559) | @Override
    method updateLong (line 565) | @Override
    method updateFloat (line 571) | @Override
    method updateDouble (line 577) | @Override
    method updateBigDecimal (line 583) | @Override
    method updateString (line 589) | @Override
    method updateBytes (line 595) | @Override
    method updateDate (line 601) | @Override
    method updateTime (line 607) | @Override
    method updateTimestamp (line 613) | @Override
    method updateAsciiStream (line 619) | @Override
    method updateBinaryStream (line 625) | @Override
    method updateCharacterStream (line 631) | @Override
    method updateObject (line 637) | @Override
    method updateObject (line 643) | @Override
    method updateNull (line 649) | @Override
    method updateBoolean (line 655) | @Override
    method updateByte (line 661) | @Override
    method updateShort (line 667) | @Override
    method updateInt (line 673) | @Override
    method updateLong (line 679) | @Override
    method updateFloat (line 685) | @Override
    method updateDouble (line 691) | @Override
    method updateBigDecimal (line 697) | @Override
    method updateString (line 703) | @Override
    method updateBytes (line 709) | @Override
    method updateDate (line 715) | @Override
    method updateTime (line 721) | @Override
    method updateTimestamp (line 727) | @Override
    method updateAsciiStream (line 733) | @Override
    method updateBinaryStream (line 739) | @Override
    method updateCharacterStream (line 745) | @Override
    method updateObject (line 751) | @Override
    method updateObject (line 757) | @Override
    method insertRow (line 763) | @Override
    method updateRow (line 769) | @Override
    method deleteRow (line 775) | @Override
    method refreshRow (line 781) | @Override
    method cancelRowUpdates (line 787) | @Override
    method moveToInsertRow (line 793) | @Override
    method moveToCurrentRow (line 799) | @Override
    method getStatement (line 805) | @Override
    method getObject (line 812) | @Override
    method getRef (line 819) | @Override
    method getBlob (line 826) | @Override
    method getClob (line 833) | @Override
    method getArray (line 840) | @Override
    method getObject (line 847) | @Override
    method getRef (line 854) | @Override
    method getBlob (line 861) | @Override
    method getClob (line 868) | @Override
    method getArray (line 875) | @Override
    method getDate (line 882) | @Override
    method getDate (line 889) | @Override
    method getTime (line 896) | @Override
    method getTime (line 903) | @Override
    method getTimestamp (line 910) | @Override
    method getTimestamp (line 917) | @Override
    method getURL (line 924) | @Override
    method getURL (line 931) | @Override
    method updateRef (line 938) | @Override
    method updateRef (line 944) | @Override
    method updateBlob (line 950) | @Override
    method updateBlob (line 956) | @Override
    method updateClob (line 962) | @Override
    method updateClob (line 968) | @Override
    method updateArray (line 974) | @Override
    method updateArray (line 980) | @Override
    method getRowId (line 986) | @Override
    method getRowId (line 993) | @Override
    method updateRowId (line 1000) | @Override
    method updateRowId (line 1006) | @Override
    method getHoldability (line 1012) | @Override
    method isClosed (line 1019) | @Override
    method updateNString (line 1026) | @Override
    method updateNString (line 1032) | @Override
    method updateNClob (line 1038) | @Override
    method updateNClob (line 1044) | @Override
    method getNClob (line 1050) | @Override
    method getNClob (line 1057) | @Override
    method getSQLXML (line 1064) | @Override
    method getSQLXML (line 1071) | @Override
    method updateSQLXML (line 1078) | @Override
    method updateSQLXML (line 1084) | @Override
    method getNString (line 1090) | @Override
    method getNString (line 1097) | @Override
    method getNCharacterStream (line 1104) | @Override
    method getNCharacterStream (line 1111) | @Override
    method updateNCharacterStream (line 1118) | @Override
    method updateNCharacterStream (line 1124) | @Override
    method updateAsciiStream (line 1130) | @Override
    method updateBinaryStream (line 1136) | @Override
    method updateCharacterStream (line 1142) | @Override
    method updateAsciiStream (line 1148) | @Override
    method updateBinaryStream (line 1154) | @Override
    method updateCharacterStream (line 1160) | @Override
    method updateBlob (line 1166) | @Override
    method updateBlob (line 1172) | @Override
    method updateClob (line 1178) | @Override
    method updateClob (line 1184) | @Override
    method updateNClob (line 1190) | @Override
    method updateNClob (line 1196) | @Override
    method updateNCharacterStream (line 1202) | @Override
    method updateNCharacterStream (line 1208) | @Override
    method updateAsciiStream (line 1214) | @Override
    method updateBinaryStream (line 1220) | @Override
    method updateCharacterStream (line 1226) | @Override
    method updateAsciiStream (line 1232) | @Override
    method updateBinaryStream (line 1238) | @Override
    method updateCharacterStream (line 1244) | @Override
    method updateBlob (line 1250) | @Override
    method updateBlob (line 1256) | @Override
    method updateClob (line 1262) | @Override
    method updateClob (line 1268) | @Override
    method updateNClob (line 1274) | @Override
    method updateNClob (line 1280) | @Override
    method getObject (line 1286) | public <T> T getObject(int columnIndex, Class<T> type) throws SQLExcep...
    method getObject (line 1292) | public <T> T getObject(String columnLabel, Class<T> type) throws SQLEx...

FILE: src/test/java/com/zaxxer/hikari/mocks/StubStatement.java
  class StubStatement (line 32) | public class StubStatement implements Statement
    method StubStatement (line 40) | public StubStatement(Connection connection) {
    method setSimulatedQueryTime (line 44) | public static void setSimulatedQueryTime(long time) {
    method unwrap (line 49) | @SuppressWarnings("unchecked")
    method isWrapperFor (line 58) | @Override
    method executeQuery (line 66) | @Override
    method executeUpdate (line 76) | @Override
    method close (line 84) | @Override
    method getMaxFieldSize (line 91) | @Override
    method setMaxFieldSize (line 99) | @Override
    method getMaxRows (line 106) | @Override
    method setMaxRows (line 114) | @Override
    method setEscapeProcessing (line 121) | @Override
    method getQueryTimeout (line 128) | @Override
    method setQueryTimeout (line 136) | @Override
    method cancel (line 147) | @Override
    method getWarnings (line 154) | @Override
    method clearWarnings (line 162) | @Override
    method setCursorName (line 169) | @Override
    method execute (line 176) | @Override
    method getResultSet (line 188) | @Override
    method getUpdateCount (line 196) | @Override
    method getMoreResults (line 204) | @Override
    method setFetchDirection (line 212) | @Override
    method getFetchDirection (line 219) | @Override
    method setFetchSize (line 227) | @Override
    method getFetchSize (line 234) | @Override
    method getResultSetConcurrency (line 242) | @Override
    method getResultSetType (line 250) | @Override
    method addBatch (line 258) | @Override
    method clearBatch (line 265) | @Override
    method executeBatch (line 272) | @Override
    method getConnection (line 280) | @Override
    method getMoreResults (line 288) | @Override
    method getGeneratedKeys (line 296) | @Override
    method executeUpdate (line 304) | @Override
    method executeUpdate (line 312) | @Override
    method executeUpdate (line 320) | @Override
    method execute (line 328) | @Override
    method execute (line 336) | @Override
    method execute (line 344) | @Override
    method getResultSetHoldability (line 352) | @Override
    method isClosed (line 360) | @Override
    method setPoolable (line 367) | @Override
    method isPoolable (line 374) | @Override
    method closeOnCompletion (line 382) | public void closeOnCompletion() throws SQLException
    method isCloseOnCompletion (line 388) | public boolean isCloseOnCompletion() throws SQLException
    method checkClosed (line 394) | private void checkClosed() throws SQLException

FILE: src/test/java/com/zaxxer/hikari/mocks/TestObject.java
  class TestObject (line 3) | public class TestObject
    method setTestObject (line 12) | public void setTestObject(TestObject testObject)
    method setString (line 17) | public void setString(String string)
    method getTestObject (line 22) | public TestObject getTestObject()
    method getString (line 27) | public String getString()
    method getShortRaw (line 32) | public short getShortRaw() {
    method setShortRaw (line 36) | public void setShortRaw(short shortRaw) {
    method setCharArray (line 40) | public void setCharArray(char[] charArray)
    method getCharArray (line 45) | public char[] getCharArray()
    method setStringArray (line 50) | public void setStringArray(String[] stringArray)
    method getStringArray (line 55) | public String[] getStringArray()
    method setIntArray (line 60) | public void setIntArray(int[] intArray)
    method getIntArray (line 65) | public int[] getIntArray()

FILE: src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java
  class OSGiBundleTest (line 41) | @RunWith(OSGiBundleTest.ConditionalPaxExam.class)
    method checkInject (line 44) | @Test
    method checkBundle (line 50) | @Test
    method config (line 75) | @Configuration
    class ConditionalPaxExam (line 91) | public static class ConditionalPaxExam extends PaxExam
      method ConditionalPaxExam (line 93) | public ConditionalPaxExam(Class<?> klass) throws InitializationError {
      method run (line 97) | @Override
      method filter (line 104) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/CodahaleMetricsTest.java
  class CodahaleMetricsTest (line 51) | public class CodahaleMetricsTest extends TestMetricsBase<MetricRegistry>
    method metricsTrackerFactory (line 53) | @Override
    method metricRegistry (line 59) | @Override
    method testHealthChecks (line 65) | @Test
    method testSetters1 (line 100) | @Test
    method testSetters2 (line 136) | @Test
    method testMetricWait (line 165) | @Test
    method testMetricUsage (line 194) | @Test
    method testMetricRegistrySubclassIsAllowed (line 227) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java
  class ConcurrentCloseConnectionTest (line 38) | public class ConcurrentCloseConnectionTest
    method testConcurrentClose (line 40) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/ConnectionPoolSizeVsThreadsTest.java
  class ConnectionPoolSizeVsThreadsTest (line 46) | public class ConnectionPoolSizeVsThreadsTest {
    method testPoolSizeAboutSameSizeAsThreadCount (line 52) | @Test
    method testSlowConnectionTimeBurstyWork (line 69) | @Test
    method testPoolSize (line 94) | private Counts testPoolSize(final int minIdle, final int maxPoolSize, ...
    class Counts (line 181) | private static class Counts {
      method updateMaxCounts (line 185) | void updateMaxCounts(final HikariPool pool) {
      method toString (line 190) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/ConnectionRaceConditionTest.java
  class ConnectionRaceConditionTest (line 42) | public class ConnectionRaceConditionTest
    method testRaceCondition (line 47) | @Test
    method after (line 98) | @After

FILE: src/test/java/com/zaxxer/hikari/pool/ConnectionStateTest.java
  class ConnectionStateTest (line 37) | public class ConnectionStateTest
    method testAutoCommit (line 39) | @Test
    method testTransactionIsolation (line 63) | @Test
    method testIsolation (line 83) | @Test
    method testReadOnly (line 95) | @Test
    method testCatalog (line 115) | @Test
    method testCommitTracking (line 135) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/Dropwizard5MetricsTest.java
  class Dropwizard5MetricsTest (line 30) | public class Dropwizard5MetricsTest extends TestMetricsBase<MetricRegistry>
    method metricsTrackerFactory (line 32) | @Override
    method metricRegistry (line 38) | @Override
    method testSetters1 (line 44) | @Test
    method testSetters2 (line 71) | @Test
    method testMetricWait (line 97) | @Test
    method testMetricUsage (line 126) | @Test
    method testMetricRegistrySubclassIsAllowed (line 159) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/ExceptionTest.java
  class ExceptionTest (line 43) | public class ExceptionTest
    method setup (line 48) | @Before
    method teardown (line 61) | @After
    method testException1 (line 67) | @Test
    method testUseAfterStatementClose (line 93) | @Test
    method testUseAfterClose (line 110) | @Test
    method testLastErrorTimeout (line 130) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/HouseKeeperCleanupTest.java
  class HouseKeeperCleanupTest (line 38) | public class HouseKeeperCleanupTest
    method before (line 43) | @Before
    method testHouseKeeperCleanupWithCustomExecutor (line 53) | @Test
    method after (line 77) | @After

FILE: src/test/java/com/zaxxer/hikari/pool/IsolationTest.java
  class IsolationTest (line 30) | public class IsolationTest
    method testIsolation (line 32) | @Test
    method testNonIsolation (line 54) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/JdbcDriverTest.java
  class JdbcDriverTest (line 32) | public class JdbcDriverTest
    method teardown (line 36) | @After
    method driverTest1 (line 44) | @Test
    method driverTest2 (line 68) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/MetricsTrackerTest.java
  class MetricsTrackerTest (line 22) | public class MetricsTrackerTest
    method connectionTimeoutIsRecorded (line 24) | @Test
    class StubMetricsTracker (line 58) | @SuppressWarnings("unused")
      method recordConnectionCreatedMillis (line 66) | @Override
      method recordConnectionAcquiredNanos (line 72) | @Override
      method recordConnectionUsageMillis (line 78) | @Override
      method recordConnectionTimeout (line 84) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/MiscTest.java
  class MiscTest (line 51) | public class MiscTest
    method testLogWriter (line 53) | @Test
    method testInvalidIsolation (line 74) | @Test
    method testCreateInstance (line 86) | @Test
    method testLeakDetection (line 98) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/PostgresTest.java
  class PostgresTest (line 42) | public class PostgresTest
    method beforeTest (line 49) | @Before
    method afterTest (line 55) | @After
    method testCase1 (line 60) | @Test
    method testCase2 (line 72) | @Test
    method testCase3 (line 84) | @Test
    method testCase4 (line 96) | @Test
    method testPgsqlJdbcUrl (line 110) | @Test
    method testCredentialRotation (line 125) | @Test
    method testSchema (line 143) | @Test
    method exerciseConfig (line 168) | static private void exerciseConfig(HikariConfig config, int numThreads) {
    method exerciseDataSource (line 176) | static private void exerciseDataSource(HikariDataSource ds, int numThr...
    method assertZeroErrors (line 186) | static private void assertZeroErrors(List<PostgresWorkerThread> thread...
    method startThreads (line 192) | static List<PostgresWorkerThread> startThreads(HikariDataSource ds, in...
    method stopThreads (line 202) | static void stopThreads(List<PostgresWorkerThread> threads) {
    class PostgresWorkerThread (line 208) | static class PostgresWorkerThread extends Thread {
      method PostgresWorkerThread (line 214) | public PostgresWorkerThread(HikariDataSource ds) {
      method requestStop (line 220) | public void requestStop() {
      method run (line 225) | public void run() {
      method getErrorCount (line 237) | public int getErrorCount() {
    method before (line 242) | @Before
    method createConfig (line 248) | static private HikariConfig createConfig(PostgreSQLContainer<?> postgr...
    method updatePostgresCredentials (line 257) | private void updatePostgresCredentials(String username, String passwor...

FILE: src/test/java/com/zaxxer/hikari/pool/RampUpDown.java
  class RampUpDown (line 33) | public class RampUpDown
    method rampUpDownTest (line 35) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/RequestBoundariesTest.java
  class RequestBoundariesTest (line 14) | public class RequestBoundariesTest {
    method getHikariPool (line 26) | private HikariPool getHikariPool(boolean enableRequestBoundaries) {
    method requestBoundaryEnabledTest (line 33) | @Test
    method requestBoundaryDisabledTest (line 45) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java
  class ShutdownTest (line 47) | public class ShutdownTest
    method beforeTest (line 49) | @Before
    method afterTest (line 57) | @After
    method testShutdown1 (line 65) | @Test
    method testShutdown2 (line 116) | @Test
    method testShutdown3 (line 146) | @Test
    method testShutdown4 (line 175) | @Test
    method testShutdown5 (line 201) | @Test
    method testAfterShutdown (line 231) | @Test
    method testShutdownDuringInit (line 252) | @Test
    method testThreadedShutdown (line 270) | @Test
    method threadCount (line 344) | private int threadCount()

FILE: src/test/java/com/zaxxer/hikari/pool/StatementTest.java
  class StatementTest (line 35) | public class StatementTest
    method setup (line 39) | @Before
    method teardown (line 51) | @After
    method testStatementClose (line 57) | @Test
    method testAutoStatementClose (line 81) | @Test
    method testStatementResultSetProxyClose (line 99) | @Test
    method testDoubleStatementClose (line 117) | @Test
    method testOutOfOrderStatementClose (line 127) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestConcurrentBag.java
  class TestConcurrentBag (line 44) | public class TestConcurrentBag
    method setup (line 49) | @BeforeClass
    method teardown (line 63) | @AfterClass
    method testConcurrentBag (line 69) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestConnectionCloseBlocking.java
  class TestConnectionCloseBlocking (line 48) | public class TestConnectionCloseBlocking {
    method testConnectionCloseBlocking (line 52) | public void testConnectionCloseBlocking() throws SQLException {
    class CustomMockDataSource (line 80) | private static class CustomMockDataSource extends MockDataSource {
      method getConnection (line 81) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/TestConnectionTimeoutRetry.java
  class TestConnectionTimeoutRetry (line 50) | public class TestConnectionTimeoutRetry
    method testConnectionRetries (line 52) | @Test
    method testConnectionRetries2 (line 80) | @Test
    method testConnectionRetries3 (line 124) | @Test
    method testConnectionRetries5 (line 173) | @Test
    method testConnectionIdleFill (line 223) | @Test
    method before (line 266) | @Before
    method after (line 272) | @After

FILE: src/test/java/com/zaxxer/hikari/pool/TestConnections.java
  class TestConnections (line 44) | @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"})
    method before (line 47) | @Before
    method after (line 55) | @After
    method testCreate (line 63) | @Test
    method testMaxLifetime (line 108) | @Test
    method testMaxLifetime2 (line 166) | @Test
    method testKeepalive (line 220) | @Test
    method testKeepalive2 (line 251) | @Test
    method testDoubleClose (line 290) | @Test
    method testCloseMarkEvicted (line 313) | @Test
    method testEviction (line 335) | @Test
    method testEviction2 (line 355) | @Test
    method testEviction3 (line 393) | @Test
    method testEvictAllRefill (line 430) | @Test
    method testBackfill (line 472) | @Test
    method testMaximumPoolLimit (line 532) | @Test
    method testOldDriver (line 581) | @Test
    method testSuspendResume (line 612) | @Test
    method testSuspendResumeWithThrow (line 655) | @Test
    method testInitializationFailure1 (line 707) | @Test
    method testInitializationFailure2 (line 729) | @Test
    method testInvalidConnectionTestQuery (line 749) | @Test
    method testDataSourceRaisesErrorWhileInitializationTestQuery (line 799) | @Test
    method testDataSourceRaisesErrorAfterInitializationTestQuery (line 819) | @Test
    method testPopulationSlowAcquisition (line 844) | @Test
    method testMinimumIdleZero (line 887) | @Test
    class StubDataSourceWithErrorSwitch (line 907) | static class StubDataSourceWithErrorSwitch extends StubDataSource
      method getConnection (line 912) | @Override
      method setErrorOnConnection (line 921) | public void setErrorOnConnection(boolean errorOnConnection) {
    class OverrideHandler (line 926) | public static class OverrideHandler implements SQLExceptionOverride
      method adjudicate (line 928) | @java.lang.Override

FILE: src/test/java/com/zaxxer/hikari/pool/TestCredentials.java
  class TestCredentials (line 17) | public class TestCredentials {
    method testCredentialsProvider (line 18) | @Test
    class TestCredentialsProvider (line 38) | public static class TestCredentialsProvider implements HikariCredentia...
      method getCredentials (line 41) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/TestElf.java
  class TestElf (line 44) | public final class TestElf
    method TestElf (line 46) | private TestElf() {
    method isJava11 (line 50) | public static boolean isJava11() {
    method getPool (line 54) | public static HikariPool getPool(final HikariDataSource ds)
    method getConcurrentBag (line 66) | static ConcurrentBag<?> getConcurrentBag(final HikariDataSource ds)
    method getUnsealedConfig (line 78) | public static HikariConfig getUnsealedConfig(final HikariDataSource ds)
    method getConnectionCommitDirtyState (line 96) | static boolean getConnectionCommitDirtyState(final Connection connection)
    method setConfigUnitTest (line 108) | static void setConfigUnitTest(final boolean unitTest)
    method setSlf4jTargetStream (line 120) | static void setSlf4jTargetStream(final Class<?> clazz, final PrintStre...
    method setSlf4jLogLevel (line 141) | static void setSlf4jLogLevel(final Class<?> clazz, final Level logLevel)
    method newHikariConfig (line 157) | public static HikariConfig newHikariConfig()
    method newHikariDataSource (line 171) | static HikariDataSource newHikariDataSource()
    class StringAppender (line 185) | private static class StringAppender extends AbstractAppender
      method StringAppender (line 189) | StringAppender(final String name, final PrintStream stream)
      method append (line 195) | @Override
    class FauxWebClassLoader (line 202) | public static class FauxWebClassLoader extends ClassLoader
      method loadClass (line 206) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/TestHibernate.java
  class TestHibernate (line 31) | public class TestHibernate
    method testConnectionProvider (line 33) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestIsRunning.java
  class TestIsRunning (line 20) | public class TestIsRunning
    method testRunningNormally (line 22) | @Test
    method testNoPool (line 32) | @Test
    method testSuspendAndResume (line 43) | @Test
    method testShutdown (line 57) | @Test
    method basicConfig (line 68) | private HikariConfig basicConfig()

FILE: src/test/java/com/zaxxer/hikari/pool/TestJNDI.java
  class TestJNDI (line 32) | public class TestJNDI
    method testJndiLookup1 (line 34) | @Test
    method testJndiLookup2 (line 55) | @Test
    method testJndiLookup3 (line 77) | @Test
    method testJndiLookup4 (line 93) | @Test
    class BogusContext (line 114) | @SuppressWarnings("unchecked")
      method createSubcontext (line 117) | @Override
      method lookup (line 123) | @Override
    class BogusContext2 (line 132) | @SuppressWarnings("unchecked")
      method createSubcontext (line 135) | @Override
      method lookup (line 141) | @Override
    class BogusRef (line 148) | private class BogusRef extends RefAddr
      method BogusRef (line 153) | BogusRef(String type, String content)
      method getContent (line 159) | @Override

FILE: src/test/java/com/zaxxer/hikari/pool/TestJavassistCodegen.java
  class TestJavassistCodegen (line 18) | public class TestJavassistCodegen {
    method testCodegen (line 19) | @Test
    method getMethod (line 60) | private Method getMethod(Class<?> clazz, String methodName, Integer......

FILE: src/test/java/com/zaxxer/hikari/pool/TestMBean.java
  class TestMBean (line 41) | public class TestMBean
    method testMBeanRegistration (line 43) | @Test
    method testMBeanReporting (line 56) | @Test
    method testMBeanChange (line 120) | @Test
    method testMBeanConnectionTimeoutChange (line 138) | @Test
    method testMBeanCredentialRotation (line 175) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestMetrics.java
  class TestMetrics (line 29) | public class TestMetrics
    method testFakeMetricRegistryThrowsIllegalArgumentException (line 31) | @Test(expected = IllegalArgumentException.class)
    class FakeMetricRegistry (line 44) | private static class FakeMetricRegistry {}

FILE: src/test/java/com/zaxxer/hikari/pool/TestMetricsBase.java
  class TestMetricsBase (line 57) | abstract class TestMetricsBase<M>
    method metricsTrackerFactory (line 59) | protected abstract MetricsTrackerFactory metricsTrackerFactory(M metri...
    method metricRegistry (line 60) | protected abstract M metricRegistry();
    method testSetters3 (line 62) | @Test
    method testSetters4 (line 95) | @Test
    method testSetters5 (line 121) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestPropertySetter.java
  class TestPropertySetter (line 38) | public class TestPropertySetter
    method testProperty1 (line 40) | @Test
    method testProperty2 (line 52) | @Test
    method testObjectProperty (line 65) | @Test
    method testPropertyUpperCase (line 80) | @Test
    method testDurationPropertiesSet (line 93) | @Test
    method testGetPropertyNames (line 114) | @Test
    method testSetNonExistantPropertyName (line 121) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestProxies.java
  class TestProxies (line 38) | public class TestProxies
    method testProxyCreation (line 40) | @Test
    method testStatementProxy (line 78) | @Test
    method testStatementExceptions (line 108) | @Test
    method testOtherExceptions (line 221) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestSaturatedPool830.java
  class TestSaturatedPool830 (line 49) | public class TestSaturatedPool830
    method saturatedPoolTest (line 54) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestStates.java
  class TestStates (line 33) | public class TestStates
    method testGetBeforeSet (line 35) | @Test
    method testGetAfterSet (line 92) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/TestValidation.java
  class TestValidation (line 35) | public class TestValidation
    method validateLoadProperties (line 37) | @Test
    method validateMissingProperties (line 46) | @Test
    method validateMissingDS (line 58) | @Test
    method validateMissingUrl (line 71) | @Test
    method validateDriverAndUrl (line 85) | @Test
    method validateBadDriver (line 99) | @Test
    method validateInvalidConnectionTimeout (line 113) | @Test
    method validateInvalidValidationTimeout (line 126) | @Test
    method validateInvalidIdleTimeout (line 139) | @Test
    method validateIdleTimeoutTooSmall (line 152) | @Test
    method validateIdleTimeoutExceedsLifetime (line 167) | @Test
    method validateInvalidMinIdle (line 185) | @Test
    method validateInvalidMaxPoolSize (line 198) | @Test
    method validateInvalidLifetime (line 211) | @Test
    method validateInvalidLeakDetection (line 228) | @Test
    method validateZeroConnectionTimeout (line 242) | @Test

FILE: src/test/java/com/zaxxer/hikari/pool/UnwrapTest.java
  class UnwrapTest (line 39) | public class UnwrapTest
    method testUnwrapConnection (line 41) | @Test
    method testUnwrapDataSource (line 63) | @Test

FILE: src/test/java/com/zaxxer/hikari/util/ClockSourceTest.java
  class ClockSourceTest (line 34) | public class ClockSourceTest
    method testClockSourceDisplay (line 36) | @Test

FILE: src/test/java/com/zaxxer/hikari/util/DriverDataSourceTest.java
  class DriverDataSourceTest (line 29) | public class DriverDataSourceTest {
    method testDriverProperties (line 31) | @Test
    method testJdbcUrlLogging (line 43) | @Test
    method testExceptionMessage (line 61) | private void testExceptionMessage(String jdbcUrl) {

FILE: src/test/java/com/zaxxer/hikari/util/PropertyElfTest.java
  class PropertyElfTest (line 10) | public class PropertyElfTest
    method setTargetFromProperties (line 12) | @Test
    method setTargetFromPropertiesNotAClass (line 29) | @Test
    method setStringArray (line 45) | @Test
    method setIntArray (line 75) | @Test

FILE: src/test/java/com/zaxxer/hikari/util/TestFastList.java
  class TestFastList (line 32) | public class TestFastList
    method testAddRemove (line 34) | @Test
    method testAddRemoveTail (line 56) | @Test
    method testOverflow (line 78) | @Test
    method testIterator (line 98) | @Test
    method testClear (line 114) | @Test
    method testRemoveLast (line 133) | @Test
    method testPolyMorphism1 (line 150) | @Test
    type Base (line 167) | interface Base
    type Base2 (line 172) | interface Base2 extends Base

FILE: src/test/java/com/zaxxer/hikari/util/TomcatConcurrentBagLeakTest.java
  class TomcatConcurrentBagLeakTest (line 44) | @FixMethodOrder(MethodSorters.NAME_ASCENDING)
    method testConcurrentBagForLeaks (line 47) | @Test
    method testConcurrentBagForLeaks2 (line 64) | @Test
    class PoolEntry (line 81) | public static class PoolEntry implements IConcurrentBagEntry
      method compareAndSet (line 85) | @Override
      method setState (line 92) | @Override
      method getState (line 98) | @Override
    class FauxWebContext (line 105) | public static class FauxWebContext
      method createConcurrentBag (line 112) | @SuppressWarnings({"ResultOfMethodCallIgnored"})
      method checkThreadLocalsForLeaks (line 130) | private void checkThreadLocalsForLeaks()
      method getContextName (line 175) | private Object getContextName()
      method checkThreadLocalMapForLeaks (line 187) | private void checkThreadLocalMapForLeaks(Object map, Field internalT...
      method loadedByThisOrChild (line 259) | private boolean loadedByThisOrChild(Object o) {
      method getThreads (line 298) | private Thread[] getThreads()
      method getPrettyClassName (line 327) | private String getPrettyClassName(Class<?> clazz)

FILE: src/test/java/com/zaxxer/hikari/util/UtilityElfTest.java
  class UtilityElfTest (line 23) | public class UtilityElfTest
    method shouldReturnValidTransactionIsolationLevel (line 25) | @Test
    method shouldThrowWhenInvalidTransactionNameGiven (line 35) | @Test(expected = IllegalArgumentException.class)
    method shouldReturnTransationIsolationLevelFromInteger (line 42) | @Test
    method shouldThrowWhenInvalidTransactionIntegerGiven (line 49) | @Test(expected = IllegalArgumentException.class)
    method shouldCreateInstanceOfClassWithConstructorThatAcceptsSuperClassAndInterfaceAndClassOfArguments (line 56) | @Test
    class ClassA (line 66) | public static class ClassA {}
    class ClassB (line 68) | public static final class ClassB extends ClassA {}
    type InterfaceC (line 70) | public interface InterfaceC {}
    class ClassC (line 72) | public final static class ClassC implements InterfaceC {}
    class ClassD (line 74) | public final static class ClassD {}
    class ClassZ (line 76) | public final static class ClassZ {
      method ClassZ (line 77) | public ClassZ(ClassA _superClassA, InterfaceC _interfaceC, ClassD _c...
Condensed preview — 139 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (880K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 232,
    "preview": "jobs:\n  build: # name of your job\n    machine: true # executor type\n    resource_class: brettwooldridge/ubuntu\n\n    step"
  },
  {
    "path": ".editorconfig",
    "chars": 279,
    "preview": "# EditorConfig is awesome: http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n[**]\nend_of_line = lf\ninse"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 767,
    "preview": "name: CI\n\non:\n  pull_request:\n    branches:\n      - master\n  push:\n    branches:\n      - master\n  # Allows you to run th"
  },
  {
    "path": ".gitignore",
    "chars": 160,
    "preview": ".classpath\n.project\n.metadata\n\ntarget/\ndependency-reduced-pom.xml\n\n.DS_Store\n\n**/*.iml\n\n*.class\n*.jar\n*.war\n*.ear\n*.iml\n"
  },
  {
    "path": ".settings/org.eclipse.core.resources.prefs",
    "chars": 216,
    "preview": "eclipse.preferences.version=1\nencoding//src/main/java=UTF-8\nencoding//src/main/resources=UTF-8\nencoding//src/test/java=U"
  },
  {
    "path": ".settings/org.eclipse.jdt.apt.core.prefs",
    "chars": 67,
    "preview": "eclipse.preferences.version=1\norg.eclipse.jdt.apt.aptEnabled=false\n"
  },
  {
    "path": ".settings/org.eclipse.jdt.core.prefs",
    "chars": 1029,
    "preview": "eclipse.preferences.version=1\norg.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=ignore\norg.eclipse.jdt.core."
  },
  {
    "path": ".settings/org.eclipse.m2e.core.prefs",
    "chars": 86,
    "preview": "activeProfiles=\neclipse.preferences.version=1\nresolveWorkspaceProjects=true\nversion=1\n"
  },
  {
    "path": ".settings/org.eclipse.pde.core.prefs",
    "chars": 62,
    "preview": "BUNDLE_ROOT_PATH=target/classes\neclipse.preferences.version=1\n"
  },
  {
    "path": "CHANGES",
    "chars": 44523,
    "preview": "HikariCP Changes\n\nChanges in 7.0.2\n\n * decrease thread yield frequency in ConcurrentBag.unreserve()\n\nChanges in 7.0.1\n\n "
  },
  {
    "path": "KEYS.txt",
    "chars": 225,
    "preview": "# GPG Release Key Fingerprints\nBrett Wooldridge <brett.wooldridge@gmail.com> F3A9 0E6B 10E8 09F8 51AB  4FC5 4CC0 8E7F 47"
  },
  {
    "path": "LICENSE",
    "chars": 10273,
    "preview": "Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/\n\nTERMS AND CONDITIONS FOR USE, REPRODUCTION, AN"
  },
  {
    "path": "README.md",
    "chars": 36969,
    "preview": "<h1><img src=\"https://github.com/brettwooldridge/HikariCP/wiki/Hikari.png\"> HikariCP<sup><sup>&nbsp;It's Faster.</sup></"
  },
  {
    "path": "codecov.yml",
    "chars": 375,
    "preview": "codecov:\n  notify:\n    require_ci_to_pass: yes\n\ncoverage:\n  precision: 2\n  round: down\n  range: \"50..80\"\n\n  status:\n    "
  },
  {
    "path": "documents/Wall-of-Fame.md",
    "chars": 2623,
    "preview": "<img width=\"260\" valign=\"middle\" src=\"http://d26gg7w375vuv5.cloudfront.net/Design+Assets/black+Wix+Logo+Assets/Black+Wix"
  },
  {
    "path": "documents/Welcome-To-The-Jungle.md",
    "chars": 8314,
    "preview": "<img width=\"340\" height=\"240\" align=\"left\" src=\"https://github.com/brettwooldridge/HikariCP/wiki/welcome-to-the-jungle.j"
  },
  {
    "path": "install-jdk.sh",
    "chars": 9998,
    "preview": "#!/usr/bin/env bash\n\n#\n# Install JDK for Linux and Mac OS\n#\n# This script determines the most recent early-access build "
  },
  {
    "path": "osx-toolchains.xml",
    "chars": 352,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF8\"?>\n<toolchains>\n   <toolchain>\n      <type>paths</type>\n      <provides>\n         <id"
  },
  {
    "path": "pom.xml",
    "chars": 28588,
    "preview": "<!--\n   Copyright (C) 2013, 2014 Brett Wooldridge\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n  "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariConfig.java",
    "chars": 42674,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariConfigMXBean.java",
    "chars": 7943,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariCredentialsProvider.java",
    "chars": 1163,
    "preview": "/*\n * Copyright (C) 2025 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariDataSource.java",
    "chars": 11224,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariJNDIFactory.java",
    "chars": 3046,
    "preview": "/*\n * Copyright (C) 2013,2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/HikariPoolMXBean.java",
    "chars": 3393,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/SQLExceptionOverride.java",
    "chars": 1953,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/hibernate/HikariConfigurationUtil.java",
    "chars": 2441,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/hibernate/HikariConnectionProvider.java",
    "chars": 4482,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/IMetricsTracker.java",
    "chars": 1063,
    "preview": "/*\n * Copyright (C) 2017 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/MetricsTracker.java",
    "chars": 814,
    "preview": "/*\n * Copyright (C) 2013,2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/MetricsTrackerFactory.java",
    "chars": 968,
    "preview": "/*\n * Copyright (C) 2013,2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/PoolStats.java",
    "chars": 2510,
    "preview": "/*\n * Copyright (C) 2015 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodaHaleMetricsTracker.java",
    "chars": 5952,
    "preview": "/*\n * Copyright (C) 2013,2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodahaleHealthChecker.java",
    "chars": 4967,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/CodahaleMetricsTrackerFactory.java",
    "chars": 1319,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTracker.java",
    "chars": 5969,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTrackerFactory.java",
    "chars": 1348,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/dropwizard/DropwizardCommon.java",
    "chars": 1419,
    "preview": "/*\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTracker.java",
    "chars": 7848,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTrackerFactory.java",
    "chars": 1259,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollector.java",
    "chars": 2832,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTracker.java",
    "chars": 4876,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerFactory.java",
    "chars": 2837,
    "preview": "/*\n * Copyright (C) 2016 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTracker.java",
    "chars": 4832,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactory.java",
    "chars": 3121,
    "preview": "/*\n * Copyright (C) 2016 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/HikariPool.java",
    "chars": 35658,
    "preview": "/*\n * Copyright (C) 2013,2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * "
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/PoolBase.java",
    "chars": 27850,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/PoolEntry.java",
    "chars": 5631,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyCallableStatement.java",
    "chars": 1237,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyConnection.java",
    "chars": 17218,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyDatabaseMetaData.java",
    "chars": 14989,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyFactory.java",
    "chars": 3483,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyLeakTask.java",
    "chars": 2849,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyLeakTaskFactory.java",
    "chars": 1709,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyPreparedStatement.java",
    "chars": 2164,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyResultSet.java",
    "chars": 2979,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/pool/ProxyStatement.java",
    "chars": 7066,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/ClockSource.java",
    "chars": 9605,
    "preview": "/*\n * Copyright (C) 2015 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/ConcurrentBag.java",
    "chars": 14279,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/Credentials.java",
    "chars": 1884,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/DriverDataSource.java",
    "chars": 6481,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/FastList.java",
    "chars": 8502,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/IsolationLevel.java",
    "chars": 1482,
    "preview": "/*\n * Copyright (C) 2019 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/JavassistProxyFactory.java",
    "chars": 9924,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/PropertyElf.java",
    "chars": 9672,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/SuspendResumeLock.java",
    "chars": 2349,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/main/java/com/zaxxer/hikari/util/UtilityElf.java",
    "chars": 10310,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/main/java/module-info.java",
    "chars": 717,
    "preview": "module com.zaxxer.hikari\n{\n   requires java.sql;\n   requires java.management;\n   requires java.naming;\n   requires org.s"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/HikariConfigTest.java",
    "chars": 3557,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/datasource/TestSealedConfig.java",
    "chars": 3079,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/db/BasicPoolTest.java",
    "chars": 5504,
    "preview": "/*\n * Copyright (C) 2016 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/dropwizard/CodaHaleMetricsTrackerTest.java",
    "chars": 1427,
    "preview": "package com.zaxxer.hikari.metrics.dropwizard;\n\nimport com.codahale.metrics.MetricRegistry;\nimport com.zaxxer.hikari.mock"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/dropwizard/Dropwizard5MetricsTrackerTest.java",
    "chars": 1647,
    "preview": "package com.zaxxer.hikari.metrics.dropwizard;\n\nimport com.zaxxer.hikari.mocks.StubPoolStats;\nimport io.dropwizard.metric"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/micrometer/MicrometerMetricsTrackerTest.java",
    "chars": 1780,
    "preview": "package com.zaxxer.hikari.metrics.micrometer;\n\nimport com.zaxxer.hikari.mocks.StubPoolStats;\nimport io.micrometer.core.i"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/prometheus/HikariCPCollectorTest.java",
    "chars": 9054,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerFactoryTest.java",
    "chars": 3024,
    "preview": "package com.zaxxer.hikari.metrics.prometheus;\n\nimport com.zaxxer.hikari.metrics.PoolStats;\nimport io.prometheus.client.C"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusHistogramMetricsTrackerTest.java",
    "chars": 6796,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerFactoryTest.java",
    "chars": 2835,
    "preview": "package com.zaxxer.hikari.metrics.prometheus;\n\nimport com.zaxxer.hikari.mocks.StubPoolStats;\nimport io.prometheus.client"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/metrics/prometheus/PrometheusMetricsTrackerTest.java",
    "chars": 12679,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/MockDataSource.java",
    "chars": 5855,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubBaseConnection.java",
    "chars": 1328,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubConnection.java",
    "chars": 12805,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubDataSource.java",
    "chars": 3578,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubDriver.java",
    "chars": 2186,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubPoolStats.java",
    "chars": 276,
    "preview": "package com.zaxxer.hikari.mocks;\n\nimport com.zaxxer.hikari.metrics.PoolStats;\n\npublic class StubPoolStats extends PoolSt"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubPreparedStatement.java",
    "chars": 14531,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubResultSet.java",
    "chars": 27323,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/StubStatement.java",
    "chars": 7991,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/mocks/TestObject.java",
    "chars": 1176,
    "preview": "package com.zaxxer.hikari.mocks;\n\npublic class TestObject\n{\n   private TestObject testObject;\n   private String string;\n"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/osgi/OSGiBundleTest.java",
    "chars": 3237,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/CodahaleMetricsTest.java",
    "chars": 8404,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ConcurrentCloseConnectionTest.java",
    "chars": 2066,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ConnectionPoolSizeVsThreadsTest.java",
    "chars": 8425,
    "preview": "/*\n * Copyright (C) 2013, 2017 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ConnectionRaceConditionTest.java",
    "chars": 3405,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ConnectionStateTest.java",
    "chars": 6102,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/Dropwizard5MetricsTest.java",
    "chars": 5737,
    "preview": "package com.zaxxer.hikari.pool;\n\nimport java.sql.Connection;\nimport java.sql.SQLException;\n\nimport com.codahale.metrics."
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ExceptionTest.java",
    "chars": 5564,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/HouseKeeperCleanupTest.java",
    "chars": 2679,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/IsolationTest.java",
    "chars": 2307,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/JdbcDriverTest.java",
    "chars": 2476,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/MetricsTrackerTest.java",
    "chars": 3117,
    "preview": "package com.zaxxer.hikari.pool;\n\nimport com.zaxxer.hikari.HikariDataSource;\nimport com.zaxxer.hikari.metrics.IMetricsTra"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/MiscTest.java",
    "chars": 4517,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/PostgresTest.java",
    "chars": 8373,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/RampUpDown.java",
    "chars": 2467,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/RequestBoundariesTest.java",
    "chars": 2239,
    "preview": "package com.zaxxer.hikari.pool;\n\nimport com.zaxxer.hikari.HikariConfig;\nimport com.zaxxer.hikari.HikariDataSource;\nimpor"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/ShutdownTest.java",
    "chars": 11952,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/StatementTest.java",
    "chars": 4024,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestConcurrentBag.java",
    "chars": 3646,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestConnectionCloseBlocking.java",
    "chars": 3670,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestConnectionTimeoutRetry.java",
    "chars": 9717,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestConnections.java",
    "chars": 32309,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestCredentials.java",
    "chars": 1706,
    "preview": "package com.zaxxer.hikari.pool;\n\nimport com.zaxxer.hikari.HikariConfig;\nimport com.zaxxer.hikari.HikariCredentialsProvid"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestElf.java",
    "chars": 7175,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestHibernate.java",
    "chars": 1712,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestIsRunning.java",
    "chars": 2227,
    "preview": "package com.zaxxer.hikari.pool;\r\n\r\nimport static com.zaxxer.hikari.pool.TestElf.getPool;\r\nimport static com.zaxxer.hikar"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestJNDI.java",
    "chars": 5219,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestJavassistCodegen.java",
    "chars": 3004,
    "preview": "package com.zaxxer.hikari.pool;\n\nimport com.zaxxer.hikari.mocks.StubConnection;\nimport com.zaxxer.hikari.pool.TestElf.Fa"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestMBean.java",
    "chars": 7232,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestMetrics.java",
    "chars": 1358,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestMetricsBase.java",
    "chars": 5432,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestPropertySetter.java",
    "chars": 5261,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestProxies.java",
    "chars": 9131,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestSaturatedPool830.java",
    "chars": 5910,
    "preview": "/*\n * Copyright (C) 2017 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestStates.java",
    "chars": 3391,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/TestValidation.java",
    "chars": 7187,
    "preview": "/*\n * Copyright (C) 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/pool/UnwrapTest.java",
    "chars": 3140,
    "preview": "/*\n * Copyright (C) 2013 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/ClockSourceTest.java",
    "chars": 2490,
    "preview": "/*\n * Copyright (C) 2016 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/DriverDataSourceTest.java",
    "chars": 2723,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/PropertyElfTest.java",
    "chars": 3429,
    "preview": "package com.zaxxer.hikari.util;\n\nimport org.junit.Test;\nimport com.zaxxer.hikari.mocks.TestObject;\n\nimport java.util.Pro"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/TestFastList.java",
    "chars": 4569,
    "preview": "/*\n * Copyright (C) 2013, 2014 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/TomcatConcurrentBagLeakTest.java",
    "chars": 12773,
    "preview": "/*\n * Copyright (C) 2017 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you m"
  },
  {
    "path": "src/test/java/com/zaxxer/hikari/util/UtilityElfTest.java",
    "chars": 2255,
    "preview": "/*\n * Copyright (C) 2013, 2019 Brett Wooldridge\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n *"
  },
  {
    "path": "src/test/resources/duration-config.properties",
    "chars": 208,
    "preview": "connectionTimeout = 2000ms\nvalidationTimeout = 22s\nidleTimeout = 33m\nleakDetectionThreshold = 44h\nmaxLifetime = 55d\n\ndat"
  },
  {
    "path": "src/test/resources/hibernate.properties",
    "chars": 191,
    "preview": "hibernate.hikari.minimumIdle=5\nhibernate.hikari.connectionTestQuery=SELECT 1\nhibernate.hikari.dataSourceClassName=com.za"
  },
  {
    "path": "src/test/resources/log4j2-test.xml",
    "chars": 378,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration status=\"OFF\">\n  <appenders>\n    <Console name=\"Console\" target=\"SY"
  },
  {
    "path": "src/test/resources/postgres_init_script.sql",
    "chars": 34,
    "preview": "CREATE SCHEMA IF NOT EXISTS test;\n"
  },
  {
    "path": "src/test/resources/propfile1.properties",
    "chars": 119,
    "preview": "minimumIdle=5\nconnectionTestQuery=SELECT 1\nautoCommit=false\ndataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource\n"
  },
  {
    "path": "src/test/resources/propfile2.properties",
    "chars": 150,
    "preview": "connectionTestQuery=SELECT 1\nautoCommit=false\ndataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource\ndataSource.user"
  },
  {
    "path": "src/test/resources/propfile3.properties",
    "chars": 180,
    "preview": "connectionTestQuery=SELECT 1\nautoCommit=false\ndataSourceClassName=com.zaxxer.hikari.mocks.StubDataSource\ndataSource.user"
  }
]

About this extraction

This page contains the full source code of the brettwooldridge/HikariCP GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 139 files (819.2 KB), approximately 186.0k tokens, and a symbol index with 1539 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!