#1
Dropwizard makes spinning up Java REST services simple—even more so when paired with a reliable database like MySQL. In this guide, you'll discover how to configure MySQL for both local development and cloud-ready production. We’ll use Docker for local setup, Kubernetes for production, and split your configuration into config-dev.yml and config-prod.yml to keep things clean and secure.

1. Add Dependencies in pom.xml

Make sure your project includes the essentials:
<dependencies>
  <!-- Dropwizard core framework -->
  <dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-core</artifactId>
    <version>${dropwizard.version}</version>
  </dependency>

  <!-- MySQL JDBC driver -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql.connector.version}</version>
  </dependency>

  <!-- Kubernetes client (optional) -->
  <dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>kubernetes-client</artifactId>
    <version>${fabric8.version}</version>
  </dependency>
</dependencies>
You’ll have Dropwizard for your service logic, MySQL connectivity, and optional Kubernetes support for cloud deployments.

2. Run MySQL with Docker for Local Dev

Create a docker-compose.yml:
version: '3'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: devdb
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    ports:
      - "3306:3306"
Launch your local MySQL instance:
docker-compose up -d
You now have a local MySQL server at localhost:3306, database devdb, and test credentials.

3. Local Configuration: config-dev.yml

Create a YAML file for dev mode:
server:
  applicationConnectors:
    - type: http
      port: 8080

database:
  driverClass: com.mysql.cj.jdbc.Driver
  user: devuser
  password: devpass
  url: jdbc:mysql://localhost:3306/devdb?useSSL=false&serverTimezone=UTC
  validationQuery: SELECT 1
Define your config POJO:
public class DbConfig {
  @JsonProperty public String driverClass;
  @JsonProperty public String user;
  @JsonProperty public String password;
  @JsonProperty public String url;
  @JsonProperty public String validationQuery;
}

public class AppConfig extends Configuration {
  @JsonProperty("database")
  public DbConfig database = new DbConfig();
}
Create the data source in your Application subclass:
ManagedDataSource ds = database.build(environment.metrics(), "mysql");
environment.lifecycle().manage(ds);
Run locally:
java -jar target/myapp.jar server config-dev.yml
Your Dropwizard app is now connected to MySQL—ready for development.

4. Prepare Kubernetes for Production

In production, credentials and connection details belong in ConfigMaps and Secrets. Run:
kubectl create configmap mysql-config \
  --from-literal=DB_URL=jdbc:mysql://mysql-service:3306/proddb?useSSL=false&serverTimezone=UTC \
  --from-literal=DB_DRIVER=com.mysql.cj.jdbc.Driver \
  --from-literal=DB_VALIDATION_QUERY=SELECT 1

kubectl create secret generic mysql-secret \
  --from-literal=DB_USER=produser \
  --from-literal=DB_PASSWORD=prodpass
This will feed your service securely at runtime.

5. Production Configuration: config-prod.yml

Your production setup will reference env vars:
server:
  applicationConnectors:
    - type: http
      port: 8080

database:
  driverClass: ${DB_DRIVER}
  user: ${DB_USER}
  password: ${DB_PASSWORD}
  url: ${DB_URL}
  validationQuery: ${DB_VALIDATION_QUERY}

6. Kubernetes Deployment Example

Include environment variables in your spec:
env:
  - name: DB_URL
    valueFrom:
      configMapKeyRef:
        name: mysql-config
        key: DB_URL
  - name: DB_DRIVER
    valueFrom:
      configMapKeyRef:
        name: mysql-config
        key: DB_DRIVER
  - name: DB_VALIDATION_QUERY
    valueFrom:
      configMapKeyRef:
        name: mysql-config
        key: DB_VALIDATION_QUERY
  - name: DB_USER
    valueFrom:
      secretKeyRef:
        name: mysql-secret
        key: DB_USER
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: mysql-secret
        key: DB_PASSWORD
Run your app in production:
java -jar myapp.jar server config-prod.yml
Your application will now connect securely to a cloud-hosted MySQL instance.

Why This Approach Works

  • Docker + YAML = fast local setup
  • Kubernetes integration = secure credentials and configs
  • Separate config files = clean environment segregation
  • Scalable & secure—from dev to production
This setup shows how easy it is to build a Dropwizard service backed by MySQL. Whether you're iterating locally with Docker or deploying to a Kubernetes cluster, this environment-aware approach ensures smooth transitions, secure configurations, and better maintainability. Your service is well-equipped to run in production with confidence and clarity.

image quote pre code