Skip to content

Commit eb55e33

Browse files
committed
Bind PostgresKVStore as default KV, Add HikariCp connection pooling
1 parent 1fb593c commit eb55e33

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

app/build.gradle

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,22 @@ dependencies {
3535
implementation "com.google.protobuf:protobuf-java:$protobufVersion"
3636

3737
implementation('org.glassfish.jersey.containers:jersey-container-servlet:3.1.0')
38-
implementation('org.glassfish.jersey.inject:jersey-hk2:3.1.0')
3938

4039
//jOOQ & Postgres impl deps
4140
implementation "org.jooq:jooq:$jooqVersion"
4241
implementation "org.jooq:jooq-meta:$jooqVersion"
4342
implementation "org.jooq:jooq-codegen:$jooqVersion"
4443
runtimeOnly "org.postgresql:postgresql:$postgresVersion"
4544
jooqGenerator "org.postgresql:postgresql:$postgresVersion"
45+
implementation 'com.zaxxer:HikariCP:5.0.1' // Connection pooling for postgres/jdbc
4646

4747
implementation "com.google.inject:guice:$guiceVersion"
48+
implementation('org.glassfish.jersey.inject:jersey-hk2:3.1.0')
4849
implementation "org.glassfish.hk2:guice-bridge:3.0.3"
4950

5051
compileOnly 'org.projectlombok:lombok:1.18.24'
5152
annotationProcessor 'org.projectlombok:lombok:1.18.24'
5253

53-
compileOnly 'org.projectlombok:lombok:1.18.24'
54-
annotationProcessor 'org.projectlombok:lombok:1.18.24'
55-
5654
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
5755
testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
5856
testImplementation "org.mockito:mockito-core:$mockitoVersion"
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,83 @@
11
package org.vss.guice;
22

33
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
45
import com.google.inject.Singleton;
6+
import com.zaxxer.hikari.HikariConfig;
7+
import com.zaxxer.hikari.HikariDataSource;
8+
import java.io.IOException;
9+
import java.io.InputStream;
10+
import java.util.Properties;
11+
import org.jooq.DSLContext;
12+
import org.jooq.SQLDialect;
13+
import org.jooq.impl.DSL;
514
import org.vss.KVStore;
615
import org.vss.impl.postgres.PostgresBackendImpl;
716

817
public class BaseModule extends AbstractModule {
18+
919
@Override
1020
protected void configure() {
21+
// Provide PostgresBackend as default implementation for KVStore.
1122
bind(KVStore.class).to(PostgresBackendImpl.class).in(Singleton.class);
1223
}
24+
25+
@Provides
26+
@Singleton
27+
// Provide DSLContext which is to be used by PostgresBackend
28+
public DSLContext provideDSLContext() throws ClassNotFoundException {
29+
// Required to load postgres drivers in tomcat
30+
Class.forName("org.postgresql.Driver");
31+
return DSL.using(HikariCPDataSource.dataSource, SQLDialect.POSTGRES);
32+
}
33+
}
34+
35+
// Provide Hikari Connection Pooling configuration for jdbc connection management.
36+
// Hikari is high-performance connection pooling library which will maintain a set of connections
37+
// to the database for us.
38+
// When we provide `HikariCPDataSource` to DSLContext, jOOQ will internally `acquire` and `release`
39+
// connections from pool.
40+
// For HikariCP config, we provide some sane defaults, but they are meant to be changed and tuned.
41+
// For specific parameter functionality, refer to HikariCP docs.
42+
class HikariCPDataSource {
43+
44+
private static HikariConfig config = new HikariConfig();
45+
public static HikariDataSource dataSource;
46+
47+
static {
48+
try (InputStream input = HikariCPDataSource.class.getClassLoader()
49+
.getResourceAsStream("hikariJdbc.properties")) {
50+
Properties hikariJdbcProperties = new Properties();
51+
hikariJdbcProperties.load(input);
52+
53+
config.setJdbcUrl(hikariJdbcProperties.getProperty("jdbc.url"));
54+
config.setUsername(hikariJdbcProperties.getProperty("jdbc.username"));
55+
config.setPassword(hikariJdbcProperties.getProperty("jdbc.password"));
56+
57+
config.setMaximumPoolSize(
58+
Integer.parseInt(hikariJdbcProperties.getProperty("hikaricp.maxPoolSize")));
59+
config.setMinimumIdle(
60+
Integer.parseInt(hikariJdbcProperties.getProperty("hikaricp.minimumIdle")));
61+
config.setConnectionTimeout(
62+
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.connectionTimeout")));
63+
config.setIdleTimeout(
64+
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.idleTimeout")));
65+
config.setMaxLifetime(
66+
Long.parseLong(hikariJdbcProperties.getProperty("hikaricp.maxLifetime")));
67+
68+
config.addDataSourceProperty("cachePrepStmts",
69+
hikariJdbcProperties.getProperty("hikaricp.cachePrepStmts"));
70+
config.addDataSourceProperty("prepStmtCacheSize",
71+
hikariJdbcProperties.getProperty("hikaricp.prepStmtCacheSize"));
72+
config.addDataSourceProperty("prepStmtCacheSqlLimit",
73+
hikariJdbcProperties.getProperty("hikaricp.prepStmtCacheSqlLimit"));
74+
75+
dataSource = new HikariDataSource(config);
76+
} catch (IOException e) {
77+
throw new RuntimeException("Unable to read hikariJdbcProperties from resources");
78+
}
79+
}
80+
81+
private HikariCPDataSource() {
82+
}
1383
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Default properties, these are meant to be changed according to application needs.
2+
3+
jdbc.url=jdbc:postgresql://localhost:5432/postgres
4+
jdbc.username=postgres
5+
jdbc.password=
6+
7+
# Idle Timeout
8+
hikaricp.minimumIdle=10
9+
10+
# Set connectionTimeout to 30 secs
11+
hikaricp.connectionTimeout=30000
12+
13+
# Set idle timeout to 10 minutes
14+
hikaricp.idleTimeout=600000
15+
16+
# Set Maximum lifetime of a connection to 30minutes
17+
hikaricp.maxLifetime=1800000
18+
19+
# Performance Optimizations
20+
hikaricp.maxPoolSize=50
21+
hikaricp.cachePrepStmts=true
22+
hikaricp.prepStmtCacheSize=250
23+
hikaricp.prepStmtCacheSqlLimit=2048

0 commit comments

Comments
 (0)