Quarkus JDBC Config
This guide explains how your Quarkus application can read configuration properties from a database using JDBC
Prerequisites
To complete this guide, you need:
- 
less than 15 minutes 
- 
an IDE 
- 
JDK 17+ installed with JAVA_HOMEconfigured appropriately
- 
Apache Maven 3.8.1+ 
Solution
We recommend that you follow the instructions in the next sections and create the application step by step.
Introduction
A database table can be used as a Key-Value store as a source of configuration for services.
This table is what the quarkus-config-jsbc extension interacts with in order to allow Quarkus applications to read configuration properties from.
Creating the Maven project
First, we need a new project. Create a new project with the following command:
mvn io.quarkus.platform:quarkus-maven-plugin:3.14.0:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=config-jdbc-quickstart \
    -DclassName="org.acme.jdbc.config.GreetingResource" \
    -Dpath="/greeting" \
    -Dextensions="config-jdbc"
cd config-jdbc-quickstartThis command generates a Maven project with a REST endpoint and imports the config-jdbc extension.
If you already have your Quarkus project configured, you can add the config-jdbc extension
to your project by running the following command in your project base directory:
./mvnw quarkus:add-extension -Dextensions="config-jdbc"This will add the following to your pom.xml:
<dependency>
    <groupId>io.quarkiverse.config</groupId>
    <artifactId>quarkus-config-jdbc</artifactId>
    <version>2.4.0</version>
</dependency>GreetingController
The Quarkus Maven plugin automatically generated a GreetingResource JAX-RS resource in the
src/main/java/org/acme/consul/config/client/GreetingResource.java file that looks like:
package org.acme.consul.config.client;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/greeting")
public class GreetingResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}As we want to use configuration properties obtained from the Config Server, we will update the GreetingResource to inject the message property. The updated code will look like this:
package org.acme.consul.config.client;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@Path("/greeting")
public class GreetingResource {
    @ConfigProperty(name = "greeting.message", defaultValue="Hello from default")
    String message;
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return message;
    }
}Configuring the application
Quarkus provides various configuration knobs under the quarkus.config.source.jdbc root. For the purposes of this guide, our Quarkus application is going to be configured in application.properties as follows:
quarkus.config.source.jdbc.username=sa
quarkus.config.source.jdbc.password=sa
quarkus.config.source.jdbc.url=jdbc:h2:tcp://localhost/mem:testAdd Configuration to Database
For the previous application configuration to work, we need to have a table named configuration with two columns key and value with a record inserted into it
CREATE TABLE IF NOT EXISTS configuration (key varchar(255), value varchar(255));
INSERT INTO configuration (key, value)
VALUES ('greeting.message', 'Hello from DB');Package and run the application
Run the application with: ./mvnw compile quarkus:dev.
Open your browser to http://localhost:8080/greeting.
The result should be: Hello from DB as it is the value obtained from the database.
Run the application as a native executable
You can of course create a native image using the instructions of the Building a native executable guide.
Configuration Reference
Configuration property fixed at build time - All other configuration properties are overridable at runtime
| Type | Default | |
|---|---|---|
| If set to true, the application will attempt to look up the configuration from DB | boolean | 
 | 
| If set to true, the application will cache all looked up the configuration from DB in memory If set to false, the application will always get the latest values from the DB | boolean | 
 | 
| Table name for configuration records | string | 
 | 
| Name of the column containing the key | string | 
 | 
| Name of the column containing the value | string | 
 | 
| The datasource username, if not defined the usename of the default datasource is used | string | value of  | 
| The datasource password, if not defined the password of the default datasource is used | string | value of  | 
| The datasource URL, if not defined the URL of the default datasource is used | string | value of  | 
| The datasource driver, if not defined the driver of the default datasource is used | string | value of  | 
| The initial size of the pool. Usually you will want to set the initial size to match at least the minimal size, but this is not enforced so to allow for architectures which prefer a lazy initialization of the connections on boot, while being able to sustain a minimal pool size after boot. | int | 
 | 
| The int pool minimum size | int | 
 | 
| The datasource pool maximum size | int | 
 | 
| The timeout before cancelling the acquisition of a new connection | 
 | 
| About the Duration format The format for durations uses the standard  You can also provide duration values starting with a number.
In this case, if the value consists only of a number, the converter treats the value as seconds.
Otherwise,  |