Thursday, September 27, 2018

HikariCP pooling

If you are going to crate connections pools you have many options:


Why shoud I HikariCP? It's just very fast and stable!














Let's create configuration with Spring boot:

<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>
<groupId>{group_id}</groupId>
<artifactId>{artifact_id}</artifactId>
<version>{version}</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
<dependency>
<groupId>net.sf.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>5.2.10.Final</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc11</artifactId>
<version>11.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava-collections</artifactId>
<version>r03</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dpendency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
view raw pom.xml hosted with ❤ by GitHub
And our database configuration property
db.host={IP}
db.port=1521
db.dbname=xe
db.user={user}
db.password={pass}
db.driver=oracle.jdbc.driver.OracleDriver
db.jdbc.driver=jdbc:oracle:thin
db.maximumPoolSize=10
db.idleTimeoutSec=60
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.hbm2ddl.auto=create
hibernate.show_sql=false
spring.jpa.hibernate.ddl-auto=validate

Our Persisntence Configuration

import com.zaxxer.hikari.HikariDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.util.Collection;
import java.util.Set;
import static com.google.common.collect.Iterables.toArray;
import static com.google.common.collect.Sets.newHashSet;
@EnableTransactionManagement
@Configuration
public class PersistenceConfiguration {
@Autowired
private Collection<ScanPersistencePackages> scanPackages;
@Bean(destroyMethod = "close")
@Primary
public HikariDataSource dataSource(
@Value("${db.host}") String host,
@Value("${db.port:5432}") int port,
@Value("${db.dbname}") String dbName,
@Value("${db.user}") String user,
@Value("${db.password}") String password,
@Value("${db.driver}") String driver,
@Value("${db.maximumPoolSize:10}") int maxPoolSize,
@Value("${db.idleTimeoutSec:60}") int idleTimeoutSec,
@Value("${db.jdbc.driver}") String jdbDriver,
@Value("${spring.jpa.hibernate.ddl-auto}") String dllAuto
) {
HikariDataSource ds = new HikariDataSource();
ds.setMaximumPoolSize(maxPoolSize);
ds.setDriverClassName(driver);
ds.setJdbcUrl(buildDataSource(host, port, dbName, jdbDriver));
ds.addDataSourceProperty("user", user);
ds.addDataSourceProperty("password", password);
ds.addDataSourceProperty("spring.jpa.hibernate.ddl-auto", dllAuto);
return ds;
}
private String buildDataSource(@Value("${db.host}") String host, @Value("${db.port:5432}") int port, @Value("${db.dbname}") String dbName, @Value("${db.jdbc.driver}") String jdbDriver) {
return new StringBuffer()
.append(jdbDriver)
.append(":")
.append("@")
.append(host)
.append(":")
.append(port)
.append(":")
.append(dbName).toString();
}
@Bean
public String[] packagesToScan() {
Set<String> packages = newHashSet();
for (ScanPersistencePackages scanPackage : scanPackages) {
packages.addAll(scanPackage.asStrings());
}
return toArray(packages, String.class);
}
}
Ah I know  packagesToScan is ugly. We have Lambdas in Java. Generally this method is craeted to scan components in different modules.

public List <String> packagesToScan() { 
   return scanPackages.stream()
            .map(ScanPersistencePackage::asStrings)
            .flatMap(Collection::stream)
            .collect(Collectors.toList());
}
And concrete persistence configuration for our module:

import com.google.common.collect.ImmutableList;
import org.springframework.stereotype.Component;
import java.util.Collection;
@Component
public class PaymentModulePersistencePackages implements ScanPersistencePackage {
public Collection<String> asStrings() {
return ImmutableList.of("net.vakhtang.domain.model");
}
}

No comments:

Post a Comment