자니노트

HikariCP 란? 본문

자바

HikariCP 란?

zaninote 2023. 3. 3. 17:38

목차

    1. 개요

    이 소개 튜토리얼에서는 HikariCP JDBC 커넥션 풀 프로젝트에 대해 설명합니다. 이는 매우 가볍고(약 130Kb), 2012년 경 Brett Wooldridge가 개발 번개처럼 빠른 JDBC 연결 풀링 프레임워크입니다.

     

    2. 시작하기

    HikariCP의 성능을 c3p0, dbcp2, Tomcat  진동와 같은 다른 연결 풀링 프레임워크와 비교할 수 있는 벤치마크 결과가 몇 가지 있습니다.예를 들어, HikariCP 팀은 다음과 같은 벤치마크를 발표했습니다(원래 결과는 여기에서 확인할 수 있습니다).

    다음과 같은 기술이 적용되었기 때문에 프레임워크는 매우 빠릅니다.

    • 바이트 코드 레벨 엔지니어링– 일부 극단적인 바이트 코드 레벨 엔지니어링(어셈블리 레벨 네이티브 코딩 포함)이 수행되었습니다.
    • 마이크로 최적화 – 거의 측정할 수 없지만 이러한 최적화가 결합되어 전체 성능이 향상됩니다.
    • Collections 프레임워크를 인텔리전트하게 사용– ArrayList < Statement >는 커스텀 클래스인 FastList로 대체되었습니다.이 클래스는 범위체크를 없애고 머리부터 꼬리까지 삭제 스캔을 수행합니다.

    3. Maven 의존관계

    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.4.5</version>
    </dependency>

    HikariCP는 6 및 7과 같은 오래된 JDK 버전도 지원합니다.적절한 버전은 이쪽과 이쪽에서 찾을 수 있습니다.Central Maven Repository에서도 최신 버전을 확인할 수 있습니다.

     

    4. 사용 방법

    이제 데모 애플리케이션을 만들 수 있습니다.pom.xml에 적절한 JDBC 드라이버 클래스의 의존성을 포함해야 합니다.종속성이 지정되지 않은 경우 응용 프로그램은 ClassNotFoundException을 슬로우합니다.

     

    4-1. 데이터원본 생성

    HikariCP의 DataSource를 사용하여 애플리케이션을 위한 단일 데이터 소스 인스턴스를 만듭니다.

    public class DataSource {
    
        private static HikariConfig config = new HikariConfig();
        private static HikariDataSource ds;
    
        static {
            config.setJdbcUrl( "jdbc_url" );
            config.setUsername( "database_username" );
            config.setPassword( "database_password" );
            config.addDataSourceProperty( "cachePrepStmts" , "true" );
            config.addDataSourceProperty( "prepStmtCacheSize" , "250" );
            config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
            ds = new HikariDataSource( config );
        }
    
        private DataSource() {}
    
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    }

    여기서 주의할 점은 스태틱블록의 초기화입니다.

    HikariConfig는 데이터 소스를 초기화하기 위해 사용되는 설정 클래스입니다.여기에는 사용자 이름, 비밀번호, jdbcUrl  dataSourceClassName의 4가지 잘 알려진 필수 파라미터가 포함되어 있습니다.

    jdbcUrl  dataSourceClassName 중 일반적으로 한 번에 하나씩 사용합니다.다만, 이전 드라이버로 이 속성을 사용하는 경우는, 양쪽 모두의 속성을 설정할 필요가 있습니다.

     

    이러한 속성 외에 다른 풀링 프레임워크에서는 제공되지 않을 수 있는 몇 가지 속성이 있습니다.

    • autoCommit
    • connectionTimeout
    • idleTimeout
    • maxLifetime
    • connectionTestQuery
    • connectionInitSql
    • validationTimeout
    • maximumPoolSize
    • poolName
    • allowPoolSuspension
    • readOnly
    • transactionIsolation
    • leakDetectionThreshold

    HikariCP는 이러한 데이터베이스 속성 때문에 두드러집니다.심지어 접속 누수를 스스로 감지할 수 있을 정도로 발전되어 있습니다.

    위의 속성에 대한 자세한 설명은 여기를 참조하십시오.

    리소스 디렉토리에 있는 속성 파일을 사용하여 HikariConfig를 초기화할 수도 있습니다.

    private static HikariConfig config = new HikariConfig("datasource.properties" );

    속성 파일은 다음과 같습니다.

    dataSourceClassName= //TBD
    dataSource.user= //TBD
    //other properties name should start with dataSource as shown above

    또한 java.util을 사용할 수 있습니다.

    Properties props = new Properties();
    props.setProperty( "dataSourceClassName" , //TBD );
    props.setProperty( "dataSource.user" , //TBD );
    //setter for other required properties
    private static HikariConfig config = new HikariConfig( props );

    또는 데이터 소스를 직접 초기화할 수도 있습니다.

    ds.setJdbcUrl( //TBD  );
    ds.setUsername( //TBD );
    ds.setPassword( //TBD );

    4.2 데이터 소스 사용

    이제 데이터 소스를 정의했으므로 데이터 소스를 사용하여 설정된 연결 풀에서 연결을 가져오고 JDBC 관련 작업을 수행할 수 있습니다.

    예를 들어 직원 부서의 사용 사례를 시뮬레이션하기 위해 dept와 emp라는 이름의 두 개의 테이블이 있다고 가정합니다.HikariCP를 사용하여 데이터베이스에서 해당 내용을 가져오는 클래스를 작성합니다.

    샘플 데이터 작성에 필요한 SQL 문을 다음에 나타냅니다.

    create table dept(
      deptno numeric,
      dname  varchar(14),
      loc    varchar(13),
      constraint pk_dept primary key ( deptno )
    );
     
    create table emp(
      empno    numeric,
      ename    varchar(10),
      job      varchar(9),
      mgr      numeric,
      hiredate date,
      sal      numeric,
      comm     numeric,
      deptno   numeric,
      constraint pk_emp primary key ( empno ),
      constraint fk_deptno foreign key ( deptno ) references dept ( deptno )
    );
    
    insert into dept values( 10, 'ACCOUNTING', 'NEW YORK' );
    insert into dept values( 20, 'RESEARCH', 'DALLAS' );
    insert into dept values( 30, 'SALES', 'CHICAGO' );
    insert into dept values( 40, 'OPERATIONS', 'BOSTON' );
     
    insert into emp values(
     7839, 'KING', 'PRESIDENT', null,
     to_date( '17-11-1981' , 'dd-mm-yyyy' ),
     7698, null, 10
    );
    insert into emp values(
     7698, 'BLAKE', 'MANAGER', 7839,
     to_date( '1-5-1981' , 'dd-mm-yyyy' ),
     7782, null, 20
    );
    insert into emp values(
     7782, 'CLARK', 'MANAGER', 7839,
     to_date( '9-6-1981' , 'dd-mm-yyyy' ),
     7566, null, 30
    );
    insert into emp values(
     7566, 'JONES', 'MANAGER', 7839,
     to_date( '2-4-1981' , 'dd-mm-yyyy' ),
     7839, null, 40
    );

    H2와 같은 인메모리 데이터베이스를 사용하는 경우 데이터를 가져오기 위해 실제 코드를 실행하기 전에 데이터베이스 스크립트를 자동으로 로드해야 합니다.다행히 H2에는 실행 시 클래스 경로에서 데이터베이스 스크립트를 로드할 수 있는 INIT 파라미터가 포함되어 있습니다.JDBC URL은 다음과 같습니다.

    jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'

    데이터베이스에서 다음 데이터를 가져오는 방법을 만들어야 합니다.

    public static List<Employee> fetchData() throws SQLException {
        String SQL_QUERY = "select * from emp";
        List<Employee> employees = null;
        try (Connection con = DataSource.getConnection();
            PreparedStatement pst = con.prepareStatement( SQL_QUERY );
            ResultSet rs = pst.executeQuery();) {
                employees = new ArrayList<>();
                Employee employee;
                while ( rs.next() ) {
                    employee = new Employee();
                    employee.setEmpNo( rs.getInt( "empno" ) );
                    employee.setEname( rs.getString( "ename" ) );
                    employee.setJob( rs.getString( "job" ) );
                    employee.setMgr( rs.getInt( "mgr" ) );
                    employee.setHiredate( rs.getDate( "hiredate" ) );
                    employee.setSal( rs.getInt( "sal" ) );
                    employee.setComm( rs.getInt( "comm" ) );
                    employee.setDeptno( rs.getInt( "deptno" ) );
                    employees.add( employee );
                }
    	} 
        return employees;
    }

    그리고 JUnit 메서드를 생성하여 테스트해야 합니다.테이블 emp 내의 행 수를 알고 있기 때문에 반환되는 목록의 크기는 행 수와 같아야 합니다.

    @Test
    public void givenConnection_thenFetchDbData() throws SQLException {
        HikariCPDemo.fetchData();
     
        assertEquals( 4, employees.size() );
    }

    5. 결론

    이 간단한 기사에서는 HikariCP를 사용하는 이점과 그 구성에 대해 설명했습니다.

    항상 그렇듯이, GitHub에서 전체 소스 코드를 사용할 수 있습니다.

     

     


    참조

    https://www.baeldung.com/hikaricp

     

    Comments