Skip to content

Commit

Permalink
Refactor datasource to use quarkus properties instead of custom ones
Browse files Browse the repository at this point in the history
  • Loading branch information
carlesarnal committed Nov 13, 2024
1 parent 4611b6f commit a167a51
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 49 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package io.apicurio.registry.storage.impl.sql;

import io.agroal.api.AgroalDataSource;
import io.agroal.api.configuration.AgroalConnectionFactoryConfiguration.TransactionIsolation;
import io.agroal.api.configuration.AgroalConnectionPoolConfiguration.TransactionRequirement;
import io.agroal.api.configuration.supplier.AgroalPropertiesReader;
import io.apicurio.common.apps.config.Info;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
Expand All @@ -13,8 +10,6 @@
import org.slf4j.Logger;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class RegistryDatasourceProducer {

Expand All @@ -25,29 +20,21 @@ public class RegistryDatasourceProducer {
@Info(category = "storage", description = "Application datasource database type", availableSince = "3.0.0")
String databaseType;

@ConfigProperty(name = "apicurio.datasource.url", defaultValue = "jdbc:h2:mem:registry_db")
@Info(category = "storage", description = "Application datasource jdbc url", availableSince = "3.0.0")
String jdbcUrl;

@ConfigProperty(name = "apicurio.datasource.username", defaultValue = "sa")
@Info(category = "storage", description = "Application datasource username", availableSince = "3.0.0")
String username;

@ConfigProperty(name = "apicurio.datasource.password", defaultValue = "sa")
@Info(category = "storage", description = "Application datasource password", availableSince = "3.0.0")
String password;
@Inject
@Named("h2")
AgroalDataSource h2Datasource;

@ConfigProperty(name = "apicurio.datasource.jdbc.initial-size", defaultValue = "20")
@Info(category = "storage", description = "Application datasource pool initial size", availableSince = "3.0.0")
String initialSize;
@Inject
@Named("postgresql")
AgroalDataSource postgresqlDatasource;

@ConfigProperty(name = "apicurio.datasource.jdbc.min-size", defaultValue = "20")
@Info(category = "storage", description = "Application datasource pool minimum size", availableSince = "3.0.0")
String minSize;
@Inject
@Named("mysql")
AgroalDataSource mysqlDatasource;

@ConfigProperty(name = "apicurio.datasource.jdbc.max-size", defaultValue = "100")
@Info(category = "storage", description = "Application datasource pool maximum size", availableSince = "3.0.0")
String maxSize;
@Inject
@Named("mssql")
AgroalDataSource mssqlDatasource;

@Produces
@ApplicationScoped
Expand All @@ -57,30 +44,24 @@ public AgroalDataSource produceDatasource() throws SQLException {

final RegistryDatabaseKind databaseKind = RegistryDatabaseKind.valueOf(databaseType);

Map<String, String> props = new HashMap<>();

props.put(AgroalPropertiesReader.MAX_SIZE, maxSize);
props.put(AgroalPropertiesReader.MIN_SIZE, minSize);
props.put(AgroalPropertiesReader.INITIAL_SIZE, initialSize);
props.put(AgroalPropertiesReader.JDBC_URL, jdbcUrl);
props.put(AgroalPropertiesReader.PRINCIPAL, username);
props.put(AgroalPropertiesReader.CREDENTIAL, password);
props.put(AgroalPropertiesReader.PROVIDER_CLASS_NAME, databaseKind.getDriverClassName());

/*
* We need to disable auto-commit to have proper transaction rollback, otherwise the data may be in an
* inconsistent state (e.g. partial deletes), or operations would not be rolled back on exception.
*/
props.put(AgroalPropertiesReader.AUTO_COMMIT, "false");
props.put(AgroalPropertiesReader.TRANSACTION_ISOLATION, TransactionIsolation.READ_COMMITTED.name());
props.put(AgroalPropertiesReader.TRANSACTION_REQUIREMENT, TransactionRequirement.WARN.name());
props.put(AgroalPropertiesReader.FLUSH_ON_CLOSE, "true");

AgroalDataSource datasource = AgroalDataSource
.from(new AgroalPropertiesReader().readProperties(props).get());

log.info("Using {} SQL storage.", databaseType);

return datasource;
switch (databaseKind) {
case h2 -> {
return h2Datasource;
}
case postgresql -> {
return postgresqlDatasource;
}
case mysql -> {
return mysqlDatasource;
}
case mssql -> {
return mssqlDatasource;
}
default -> throw new IllegalStateException(
String.format("unrecognized database type: %s", databaseKind.name()));
}

}
}
39 changes: 38 additions & 1 deletion app/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -162,13 +162,50 @@ apicurio.import.work-dir=${java.io.tmpdir}

## SQL Storage
apicurio.storage.sql.kind=h2
apicurio.sql.init=true

apicurio.datasource.url=jdbc:h2:mem:db_${quarkus.uuid}
apicurio.datasource.username=sa
apicurio.datasource.password=sa
apicurio.datasource.jdbc.initial-size=20
apicurio.datasource.jdbc.min-size=20
apicurio.datasource.jdbc.max-size=100
apicurio.sql.init=true

## H2
quarkus.datasource.h2.db-kind=h2
quarkus.datasource.h2.jdbc.url=${apicurio.datasource.url}
quarkus.datasource.h2.username=${apicurio.datasource.username}
quarkus.datasource.h2.password=${apicurio.datasource.password}
quarkus.datasource.h2.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
quarkus.datasource.h2.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
quarkus.datasource.h2.jdbc.max-size=${apicurio.datasource.jdbc.max-size}

## Postgresql
quarkus.datasource.postgresql.db-kind=postgresql
quarkus.datasource.postgresql.jdbc.url=${apicurio.datasource.url}
quarkus.datasource.postgresql.username=${apicurio.datasource.username}
quarkus.datasource.postgresql.password=${apicurio.datasource.password}
quarkus.datasource.postgresql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
quarkus.datasource.postgresql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
quarkus.datasource.postgresql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}

## Mysql
quarkus.datasource.mysql.db-kind=mysql
quarkus.datasource.mysql.jdbc.url=${apicurio.datasource.url}
quarkus.datasource.mysql.username=${apicurio.datasource.username}
quarkus.datasource.mysql.password=${apicurio.datasource.password}
quarkus.datasource.mysql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
quarkus.datasource.mysql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
quarkus.datasource.mysql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}

## Mssql
quarkus.datasource.mssql.db-kind=mssql
quarkus.datasource.mssql.jdbc.url=${apicurio.datasource.url}
quarkus.datasource.mssql.username=${apicurio.datasource.username}
quarkus.datasource.mssql.password=${apicurio.datasource.password}
quarkus.datasource.mssql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
quarkus.datasource.mssql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
quarkus.datasource.mssql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}

## Kafka SQL storage
apicurio.kafkasql.bootstrap.servers=localhost:9092
Expand Down

0 comments on commit a167a51

Please sign in to comment.