Back to Repositories

Testing Connection Isolation Management in HikariCP

This test suite validates the connection isolation functionality in HikariCP’s connection pooling implementation. It verifies how the pool handles connection isolation settings and ensures proper connection management between requests.

Test Coverage Overview

The test suite provides comprehensive coverage of HikariCP’s connection isolation mechanisms.

Key areas tested include:
  • Connection isolation with isolateInternalQueries enabled
  • Connection behavior with isolation disabled
  • Connection unwrapping and identity verification
  • Connection pool reuse patterns

Implementation Analysis

The testing approach uses JUnit to validate connection isolation behaviors in both isolated and non-isolated scenarios. The implementation leverages try-with-resources patterns for proper connection handling and uses assertion methods to verify connection identity and isolation states.

Technical patterns include:
  • Resource management using try-with-resources
  • Connection unwrapping verification
  • Pool configuration testing
  • Mock data source integration

Technical Details

Testing tools and configuration:
  • JUnit testing framework
  • HikariDataSource configuration
  • StubDataSource for mocking
  • Connection pooling parameters (minimum idle: 1, maximum pool size: 1)
  • Assertion utilities for connection validation

Best Practices Demonstrated

The test suite exemplifies several testing best practices for database connection management.

Notable practices include:
  • Proper resource cleanup with automatic closure
  • Isolated test cases for different scenarios
  • Clear test method naming conventions
  • Effective use of assertions for validation
  • Controlled test environment setup

brettwooldridge/hikaricp

src/test/java/com/zaxxer/hikari/pool/IsolationTest.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.pool;

import static com.zaxxer.hikari.pool.TestElf.newHikariDataSource;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;

import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;

import com.zaxxer.hikari.HikariDataSource;

public class IsolationTest
{
   @Test
   public void testIsolation() throws SQLException
   {
      try (HikariDataSource ds = newHikariDataSource()) {
         ds.setMinimumIdle(1);
         ds.setMaximumPoolSize(1);
         ds.setIsolateInternalQueries(true);
         ds.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource");

         try (Connection connection = ds.getConnection()) {
            connection.close();

            try (Connection connection2 = ds.getConnection()) {
               connection2.close();

               assertNotSame(connection, connection2);
               assertSame(connection.unwrap(Connection.class), connection2.unwrap(Connection.class));
            }
         }
      }
   }

   @Test
   public void testNonIsolation() throws SQLException
   {
      try (HikariDataSource ds = newHikariDataSource()) {
         ds.setMinimumIdle(1);
         ds.setMaximumPoolSize(1);
         ds.setIsolateInternalQueries(false);
         ds.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource");

         try (Connection connection = ds.getConnection()) {
            connection.close();

            try (Connection connection2 = ds.getConnection()) {
               connection2.close();

               assertSame(connection.unwrap(Connection.class), connection2.unwrap(Connection.class));
            }
         }
      }
   }
}