Fala, dev! Se você chegou até aqui, provavelmente está querendo conectar sua aplicação Quarkus com um banco Oracle, certo? Pois bem, hoje vou te mostrar que isso é bem mais simples do que parece. E o melhor: vamos fazer isso usando recursos gratuitos da Oracle Cloud!
Por que Oracle + Quarkus?
Olha, eu sei que muita gente torce o nariz quando fala de Oracle Database. "Ah, é caro", "é complexo", "é coisa de empresa grande"... Mas calma lá! A Oracle mudou bastante nos últimos anos. Hoje em dia, eles têm um Free Tier bem generoso que dá pra fazer muita coisa legal sem gastar nada. E combinado com o Quarkus? Meu amigo, é top demais!
Primeiro Passo: Conseguindo um Oracle Database de Graça
Antes de mais nada, você sabia que a Oracle oferece dois Autonomous Databases totalmente gratuitos pra sempre? Isso mesmo, não é trial de 30 dias não. É Always Free! Cada banco vem com 1 OCPU e 20GB de armazenamento. Dá pra fazer muita coisa com isso.
Para começar:
- Acesse Oracle Cloud Free Tier
- Crie sua conta (vai precisar de um cartão de crédito, mas relaxa, é só pra validação)
- Escolha bem sua home region - os recursos Always Free só funcionam lá
- Depois de logado, crie um Autonomous Database (pode ser ATP ou ADW)
Dica de ouro: Guarde bem as credenciais e baixe o wallet de conexão. Você vai precisar!
Configurando o Quarkus
Agora vem a parte boa. Vamos configurar o Quarkus pra conversar com o Oracle.
Adicionando as Dependências
No seu pom.xml, adicione:
<!-- Driver JDBC do Oracle --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-jdbc-oracle</artifactId> </dependency> <!-- Hibernate ORM (opcional, mas muito útil) --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm</artifactId> </dependency> <!-- Panache para facilitar os repositórios (opcional) --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-hibernate-orm-panache</artifactId> </dependency> Configurando o application.properties
Aqui é onde a mágica acontece. No seu src/main/resources/application.properties:
# Configuração básica do datasource quarkus.datasource.db-kind=oracle quarkus.datasource.username=ADMIN quarkus.datasource.password=SuaSenhaSegura123! # URL de conexão - essa aqui é pra Autonomous Database quarkus.datasource.jdbc.url=jdbc:oracle:thin:@sua_connection_string_aqui # Pool de conexões - ajuste conforme sua necessidade quarkus.datasource.jdbc.min-size=2 quarkus.datasource.jdbc.max-size=8 # Hibernate properties (opcional) quarkus.hibernate-orm.database.generation=update quarkus.hibernate-orm.log.sql=true Atenção: Se você estiver usando o Autonomous Database com wallet, a configuração fica um pouquinho diferente. Você vai precisar configurar o TNS_ADMIN apontando pro diretório do wallet descompactado.
Exemplo Prático: Criando uma API Estilo Naruto!
Bora colocar a mão na massa? Vamos criar uma entidade simples pra testar nossa conexão. Imagina que você está criando um sistema pra gerenciar ninjas e seus jutsus!
package br.com.exemplo.entity; import jakarta.persistence.*; @Entity @Table(name = "NINJA") public class Ninja { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String nome; private String vila; private Integer nivel; // Getters e setters básicos public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getVila() { return vila; } public void setVila(String vila) { this.vila = vila; } public Integer getNivel() { return nivel; } public void setNivel(Integer nivel) { this.nivel = nivel; } } E vamos criar um repositório simples usando Panache:
package br.com.exemplo.repository; import br.com.exemplo.entity.Ninja; import io.quarkus.hibernate.orm.panache.PanacheRepository; import jakarta.enterprise.context.ApplicationScoped; import java.util.List; @ApplicationScoped public class NinjaRepository implements PanacheRepository<Ninja> { // Busca ninjas por vila public List<Ninja> findByVila(String vila) { return find("vila", vila).list(); } // Busca ninjas de alto nível public List<Ninja> findJounin() { return find("nivel >= 10").list(); } } Dicas Valiosas do Mundo Real
Depois de alguns anos trabalhando com essa stack, aprendi algumas coisas que podem te poupar muito tempo:
1. Use Connection Pools Adequados
Não seja ganancioso com conexões. O Oracle funciona melhor com pools menores e bem configurados do que com dezenas de conexões ociosas. Comece com min-size=2 e max-size=8 e vá ajustando conforme a necessidade.
2. Sequences vs Identity
No Oracle, prefira sempre SEQUENCE ao invés de IDENTITY para geração de IDs. É mais performático e te dá mais controle. Trust me on this one!
3. Native Queries Quando Necessário
O Oracle tem features muito poderosas que às vezes o JPA não consegue aproveitar totalmente. Não tenha medo de usar native queries para operações específicas:
import jakarta.persistence.Query; Query query = em.createNativeQuery( "SELECT * FROM NINJA WHERE NIVEL > :nivel ORDER BY NOME", Ninja.class ); query.setParameter("nivel", 5); List<Ninja> ninjas = query.getResultList(); 4. Dev Services, use-os!
Durante o desenvolvimento, você pode usar o Dev Services com Oracle. O Quarkus vai subir um container automaticamente! Adicione no application.properties:
# Em dev mode, o Quarkus vai subir um Oracle container automaticamente %dev.quarkus.datasource.devservices.enabled=true %dev.quarkus.datasource.devservices.image-name=gvenzl/oracle-free:23-slim # Ou se preferir desabilitar e usar sua própria instância %dev.quarkus.datasource.devservices.enabled=false Isso vai subir um Oracle Database Free automaticamente quando você rodar em modo dev. Muito útil pra não ficar gastando os recursos do Free Tier durante desenvolvimento!
5. Monitoramento é Essencial
Configure o health check do Quarkus pra monitorar a conexão com o banco:
import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.persistence.EntityManager; import org.eclipse.microprofile.health.HealthCheck; import org.eclipse.microprofile.health.HealthCheckResponse; import org.eclipse.microprofile.health.Readiness; @ApplicationScoped @Readiness public class DatabaseHealthCheck implements HealthCheck { @Inject EntityManager em; @Override public HealthCheckResponse call() { try { em.createNativeQuery("SELECT 1 FROM DUAL").getSingleResult(); return HealthCheckResponse.up("Database connection"); } catch (Exception e) { return HealthCheckResponse.down("Database connection"); } } } Troubleshooting Comum
Vou te poupar de algumas dores de cabeça que já passei:
"ORA-12154: TNS:could not resolve the connect identifier"
→ Verifique se o wallet está no lugar certo e se o TNS_ADMIN está configurado
"Connection pool exhausted"
→ Aumente o max-size ou verifique se não tem query travando conexões
"Table or view does not exist"
→ Lembre-se que o Oracle é case-sensitive para nomes entre aspas. Use sempre UPPER_CASE
Performance ruim em queries
→ Verifique os índices e use EXPLAIN PLAN pra entender o que tá acontecendo
Próximos Passos
Agora que você já tem o básico funcionando, porque não ver algo a mais? O Oracle tem features incríveis como JSON nativo, spatial data, graph databases... E o Quarkus consegue aproveitar tudo isso!
Ah, e se você curtiu esse conteúdo e quer aprender mais sobre Quarkus, te faço um convite! Temos uma comunidade super ativa onde compartilhamos conhecimento, tiramos dúvidas e fazemos networking.
Junte-se ao Quarkus Club:
- Discord: https://discord.gg/nMeSs2u4ZJ
- YouTube: https://www.youtube.com/@QuarkusClub
E se quiser trocar uma ideia sobre Java, Quarkus, eventos tech ou carreira, me adiciona no LinkedIn! Sempre posto conteúdo por lá:
Conclusão
Viu só? Configurar Oracle com Quarkus não é nenhum bicho de sete cabeças. Com o Free Tier da Oracle, você tem um ambiente robusto pra desenvolver e até mesmo rodar aplicações pequenas em produção. E o Quarkus? Bem, ele faz toda a parte chata pra você poder focar no que importa: resolver problemas de negócio.
Lembre-se: a documentação oficial do Quarkus (https://quarkus.io/guides/datasource) é sempre sua melhor amiga quando bater aquela dúvida específica. Mas agora você já tem uma base sólida pra começar!
Gracias!
Por Luis De Llamas
Developer Advocate
Top comments (0)