From a167a51e4d1ca2ed99e6c0e5094d10e52c6a153f Mon Sep 17 00:00:00 2001 From: Carles Arnal Date: Wed, 13 Nov 2024 15:15:44 +0100 Subject: [PATCH] Refactor datasource to use quarkus properties instead of custom ones --- .../impl/sql/RegistryDatasourceProducer.java | 77 +++++++------------ app/src/main/resources/application.properties | 39 +++++++++- 2 files changed, 67 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/io/apicurio/registry/storage/impl/sql/RegistryDatasourceProducer.java b/app/src/main/java/io/apicurio/registry/storage/impl/sql/RegistryDatasourceProducer.java index 99a5c8ac3a..0875541602 100644 --- a/app/src/main/java/io/apicurio/registry/storage/impl/sql/RegistryDatasourceProducer.java +++ b/app/src/main/java/io/apicurio/registry/storage/impl/sql/RegistryDatasourceProducer.java @@ -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; @@ -13,8 +10,6 @@ import org.slf4j.Logger; import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; public class RegistryDatasourceProducer { @@ -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 @@ -57,30 +44,24 @@ public AgroalDataSource produceDatasource() throws SQLException { final RegistryDatabaseKind databaseKind = RegistryDatabaseKind.valueOf(databaseType); - Map 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())); + } + } } diff --git a/app/src/main/resources/application.properties b/app/src/main/resources/application.properties index cab7cce220..8effeb6029 100644 --- a/app/src/main/resources/application.properties +++ b/app/src/main/resources/application.properties @@ -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