Skip to content

Commit 909f7cc

Browse files
authored
Merge pull request #11 from G8XSU/base-di-setup
Add Guice DI, Add HikariCP connection pooling
2 parents 30d50d4 + eb55e33 commit 909f7cc

File tree

4 files changed

+131
-1
lines changed

4 files changed

+131
-1
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ dependencies {
4242
implementation "org.jooq:jooq-codegen:$jooqVersion"
4343
runtimeOnly "org.postgresql:postgresql:$postgresVersion"
4444
jooqGenerator "org.postgresql:postgresql:$postgresVersion"
45+
implementation 'com.zaxxer:HikariCP:5.0.1' // Connection pooling for postgres/jdbc
4546

4647
implementation "com.google.inject:guice:$guiceVersion"
48+
implementation('org.glassfish.jersey.inject:jersey-hk2:3.1.0')
49+
implementation "org.glassfish.hk2:guice-bridge:3.0.3"
4750

4851
compileOnly 'org.projectlombok:lombok:1.18.24'
4952
annotationProcessor 'org.projectlombok:lombok:1.18.24'
Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,31 @@
11
package org.vss;
22

3+
import com.google.inject.Guice;
4+
import com.google.inject.Injector;
5+
import jakarta.inject.Inject;
36
import jakarta.ws.rs.ApplicationPath;
7+
import org.glassfish.hk2.api.ServiceLocator;
48
import org.glassfish.jersey.server.ResourceConfig;
9+
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
10+
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
11+
import org.vss.guice.BaseModule;
512

613
@ApplicationPath("/")
714
public class VSSApplication extends ResourceConfig {
8-
public VSSApplication() {
15+
16+
@Inject
17+
public VSSApplication(ServiceLocator serviceLocator) {
18+
packages("org.vss");
19+
Injector injector = Guice.createInjector(new BaseModule());
20+
initGuiceIntoHK2Bridge(serviceLocator, injector);
21+
}
22+
23+
// By default, Jersey framework uses HK2 for dependency injection.
24+
// To use Guice as our dependency injection framework, we provide guice injector to hk2-bridge.
25+
// So that hk2 can query guice injector for creating/injecting objects.
26+
private void initGuiceIntoHK2Bridge(ServiceLocator serviceLocator, Injector injector) {
27+
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
28+
GuiceIntoHK2Bridge guiceBridge = serviceLocator.getService(GuiceIntoHK2Bridge.class);
29+
guiceBridge.bridgeGuiceInjector(injector);
930
}
1031
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package org.vss.guice;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.Provides;
5+
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;
14+
import org.vss.KVStore;
15+
import org.vss.impl.postgres.PostgresBackendImpl;
16+
17+
public class BaseModule extends AbstractModule {
18+
19+
@Override
20+
protected void configure() {
21+
// Provide PostgresBackend as default implementation for KVStore.
22+
bind(KVStore.class).to(PostgresBackendImpl.class).in(Singleton.class);
23+
}
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+
}
83+
}
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)