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 40bd431 commit 8876779
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 0 deletions.
4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,17 @@ 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'

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 8876779

Please sign in to comment.