Skip to content

Commit

Permalink
Bind PostgresKVStore as default, add HikariCp connection pooling defa…
Browse files Browse the repository at this point in the history
…ult config
  • Loading branch information
G8XSU committed Jul 12, 2023
1 parent ee9deeb commit 29397fd
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 0 deletions.
7 changes: 7 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ buildscript {
ext.protobufVersion = '3.21.7'
ext.jerseyVersion = '3.1.0'
ext.junitVersion = '5.9.0'
ext.mockitoVersion = '5.2.0'
ext.postgresVersion = '42.5.1'
ext.jooqVersion = '3.17.7'
ext.guiceVersion = '5.1.0'
Expand Down Expand Up @@ -42,17 +43,23 @@ dependencies {
implementation "org.jooq:jooq-codegen:$jooqVersion"
runtimeOnly "org.postgresql:postgresql:$postgresVersion"
jooqGenerator "org.postgresql:postgresql:$postgresVersion"
implementation 'com.zaxxer:HikariCP:5.0.1' // Connection pooling for postgres/jdbc

implementation "com.google.inject:guice:$guiceVersion"
implementation "org.glassfish.hk2:guice-bridge:3.0.3"

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

implementation('org.glassfish.jersey.inject:jersey-hk2:3.1.0')
implementation "org.glassfish.hk2:guice-bridge:3.0.3"

compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'

testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
testImplementation "org.mockito:mockito-core:$mockitoVersion"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
testImplementation "org.hamcrest:hamcrest-library:2.2"
testImplementation "org.testcontainers:junit-jupiter:1.17.6"
Expand Down
61 changes: 61 additions & 0 deletions app/src/main/java/org/vss/guice/BaseModule.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,74 @@
package org.vss.guice;

import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.jooq.DSLContext;
import org.jooq.SQLDialect;
import org.jooq.impl.DSL;
import org.vss.KVStore;
import org.vss.impl.postgres.PostgresBackendImpl;

public class BaseModule extends AbstractModule {

@Override
protected void configure() {
bind(KVStore.class).to(PostgresBackendImpl.class).in(Singleton.class);
}

@Provides
@Singleton
public DSLContext provideDSLContext() throws ClassNotFoundException {
// Required to load postgres drivers in tomcat
Class.forName("org.postgresql.Driver");
return DSL.using(HikariCPDataSource.dataSource, SQLDialect.POSTGRES);
}
}

class HikariCPDataSource {

private static HikariConfig config = new HikariConfig();
public static HikariDataSource dataSource;

static {
try (InputStream input = HikariCPDataSource.class.getClassLoader()
.getResourceAsStream("hikariJdbc.properties")) {
Properties hikariJdbcProperties = new Properties();
hikariJdbcProperties.load(input);

config.setJdbcUrl(hikariJdbcProperties.getProperty("jdbc.url"));
config.setUsername(hikariJdbcProperties.getProperty("jdbc.username"));
config.setPassword(hikariJdbcProperties.getProperty("jdbc.password"));

config.setMaximumPoolSize(
Integer.parseInt(hikariJdbcProperties.getProperty("hikaricp.maxPoolSize")));
config.setMinimumIdle(
Integer.parseInt(hikariJdbcProperties.getProperty("hikaricp.minimumIdle")));
config.setConnectionTimeout(
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.connectionTimeout")));
config.setIdleTimeout(
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.idleTimeout")));
config.setMaxLifetime(
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.maxLifetime")));

config.addDataSourceProperty("cachePrepStmts",
hikariJdbcProperties.getProperty("hikaricp.cachePrepStmts"));
config.addDataSourceProperty("prepStmtCacheSize",
hikariJdbcProperties.getProperty("hikaricp.prepStmtCacheSize"));
config.addDataSourceProperty("prepStmtCacheSqlLimit",
hikariJdbcProperties.getProperty("hikaricp.prepStmtCacheSqlLimit"));

dataSource = new HikariDataSource(config);
} catch (IOException e) {
throw new RuntimeException("Unable to read hikariJdbcProperties from resources");
}
}

private HikariCPDataSource() {
}
}
23 changes: 23 additions & 0 deletions app/src/main/resources/hikariJdbc.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Default properties, these are meant to be changed according to application needs.

jdbc.url=jdbc:postgresql://localhost:5432/postgres
jdbc.username=postgres
jdbc.password=

# Idle Timeout
hikaricp.minimumIdle=10

# Set connectionTimeout to 30 secs
hikaricp.connectionTimeout=30000

# Set idle timeout to 10 minutes
hikaricp.idleTimeout=600000

# Set Maximum lifetime of a connection to 30minutes
hikaricp.maxLifetime=1800000

# Performance Optimizations
hikaricp.maxPoolSize=50
hikaricp.cachePrepStmts=true
hikaricp.prepStmtCacheSize=250
hikaricp.prepStmtCacheSqlLimit=2048

0 comments on commit 29397fd

Please sign in to comment.