{"id":19569699,"url":"https://github.com/robertoscolar/multiple-datasources-spring-config","last_synced_at":"2026-05-20T07:33:29.459Z","repository":{"id":177465655,"uuid":"660387726","full_name":"robertoscolar/multiple-datasources-spring-config","owner":"robertoscolar","description":"Projeto com o intuito de exemplificar a configuração de múltiplos datasources para projetos Spring.","archived":false,"fork":false,"pushed_at":"2024-08-29T04:54:05.000Z","size":104,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-26T10:30:29.534Z","etag":null,"topics":["datasources","java","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/robertoscolar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-06-29T22:39:16.000Z","updated_at":"2024-08-29T04:54:54.000Z","dependencies_parsed_at":"2024-11-11T06:11:58.896Z","dependency_job_id":"9e37a54c-6e0f-4e42-855f-1d7f6edb90bb","html_url":"https://github.com/robertoscolar/multiple-datasources-spring-config","commit_stats":null,"previous_names":["robertoscolar/multiple-datasources-spring-config"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/robertoscolar/multiple-datasources-spring-config","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertoscolar%2Fmultiple-datasources-spring-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertoscolar%2Fmultiple-datasources-spring-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertoscolar%2Fmultiple-datasources-spring-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertoscolar%2Fmultiple-datasources-spring-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/robertoscolar","download_url":"https://codeload.github.com/robertoscolar/multiple-datasources-spring-config/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/robertoscolar%2Fmultiple-datasources-spring-config/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266831296,"owners_count":23991477,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datasources","java","spring-boot"],"created_at":"2024-11-11T06:11:56.732Z","updated_at":"2026-05-20T07:33:24.412Z","avatar_url":"https://github.com/robertoscolar.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Configuração de dois datasources em projeto Spring Boot\nEste é um projeto simples criado em Spring Boot, com o único intuito de exemplificar o funcionamento de dois datasources trabalhando juntos dentro de uma única aplicação usando o framework.\nPor conta disso, só teremos duas entidades: `User` e `Department`. Cada uma usará um banco diferente.\n\nO principal motivo para o projeto é a consulta e cópia posterior das classes de configuração localizadas em `src/main/java/br/com/datasource/config` , \ntendo em vista que os únicos pontos que mudarão para outras conexões subsequentes serão as informações de conexão,\nestas sendo únicas para cada banco.\n\n\u003cbr\u003e\n\n## Configurações\nOs dados dos datasources estão localizados no `application.properties`, dentro da pasta `resources`.\n\nPara o exemplo deste projeto escolhi os bancos `MySQL` e `PostgreSQL`, mas poderia ser qualquer um, incluindo os não-relacionais.\n\nPara que a classe de configuração pegue a url e usuário corretos, geralmente é usado um prefixo para identificação, por exemplo:\n\n\u003e `spring.datasource.mysql` para configurações do MySQL\n\n\u003e `spring.datasource.postgres` para configurações do PostgreSQL\n\nPodemos ver como o framework trabalha com essas informações visualizando a própria classe de configuração dos datasources. Temos uma para cada banco no projeto e ambas estão localizadas em `src/main/java/br/com/datasource/config`, como citado anteriormente. O padrão de nome \nusado nas classes são: `DataSourceBancoUsadoConfig`, como exemplo temos:\n`DataSourceMySQLConfig`. \n\n\u003e ATENÇÃO: Este nome não é obrigatório, apenas o nome que eu escolhi para as classes neste projeto.\n\n\u003cbr\u003e\n\n## Arquitetura\n\nÉ importante notar que as entidades e repositórios têm 2 pacotes diferentes, uma para cada banco de dados.\nIsso acontece para o Spring saber exatamente qual será a conexão usada para cada instância desse repositório\ne qual será a entidade a ser trabalhada.\n\nCom a classe configurada, o Spring saberá oque deve ser injetado quando receber a anotação\n`@Autowired`.\n\nNo exemplo da aplicação, tudo que estiver dentro do pacote `mysql` dentro de \n`src/main/java/br/com/datasource/model` e `src/main/java/br/com/datasource/repository` será gerenciado\npela conexão do mysql, e a mesma coisa acontece pro outro, no caso o postgres.\n\n\u003cbr\u003e\n\n## Como funciona a classe de configuração do datasource\n\n\u003cbr\u003e\n\nPara a melhor compreensão dos itens usarei o DataSourceMySQLConfig como exemplo. Mas esteja ciente que o mesmo processo acontece pra ambas as classes.\n\nA anotação `@Configuration` indica que essa classe é uma configuração do Spring e define um ou mais beans que serão gerenciados pelo contêiner do Spring.\n\nA anotação `@EnableTransactionManagement` habilita o suporte a transações, permitindo que os métodos anotados com `@Transactional` executem dentro de uma transação.\n\nA anotação `@EnableJpaRepositories` indica que as interfaces de repositório JPA devem ser ativadas para permitir o acesso aos dados no MySQL. Ela especifica o pacote base onde os repositórios estão localizados (`br.com.datasource.domain.repository.mysql`) e também faz referência ao `entityManagerFactoryRef` e ao `transactionManagerRef`.\n\n\u003cbr\u003e\n\nA classe possui três métodos anotados com `@Bean`, que são responsáveis por configurar e fornecer os beans gerenciados pelo Spring:\n\n1. O método `mysqlDataSource()` configura e retorna um DataSource para o MySQL. Ele usa a anotação `@ConfigurationProperties` para definir as propriedades do banco de dados MySQL a serem lidas a partir do arquivo de propriedades do Spring (`application.properties`), utilizando o prefixo `spring.datasource.mysql`.\n\n2. O método `mysqlEntityManagerFactory()` configura e retorna um `LocalContainerEntityManagerFactoryBean` para o MySQL. Ele recebe o `DataSource` configurado anteriormente e um `EntityManagerFactoryBuilder` como parâmetros. O `EntityManagerFactoryBuilder` é usado para construir o `EntityManagerFactory` com base nas configurações fornecidas. Nesse método, é especificado o pacote base onde as entidades JPA estão localizadas (`br.com.datasource.domain.model.mysql`).\n\n3. O método `mysqlTransactionManager()` configura e retorna um `PlatformTransactionManager` para o MySQL. Ele recebe o `LocalContainerEntityManagerFactoryBean` configurado anteriormente como parâmetro e cria um `JpaTransactionManager` com base nesse `EntityManagerFactory`. O `JpaTransactionManager` é uma implementação do `PlatformTransactionManager` para uso com o JPA.\n\n\u003cbr\u003e\n\nA anotação `@Primary` só é usada aqui porque o Spring precisa de um datasource que seja primário, caso contrário não funciona.\nEsse ponto é importante pois apenas uma das classes de configuração deve ter essa anotação.\n\n\u003cbr\u003e\n\n## Como testar\n\nPasso-a-passo:\n\n1. Para testar é necessário ter os bancos rodando na máquina local com o mesmo user e password do `application.properties`:\n\n\u003e POSTGRESQL\n\n- Database: postgres\n- Porta: 5432\n- User: postgres\n- Password: postgres\n\n\u003e MYSQL\n\n- Database: mysql\n- Porta: 3306\n- User: root\n- Password: root\n\n\u003e Para uma configuração mais fácil dos bancos de dados, é disponibilizado o arquivo `docker-compose.yml`.\n\u003e Para usá-lo, é só usar o comando `docker-compose up` no terminal, dentro da raiz do projeto.\n\u003e Dessa forma o Docker configurará todos os bancos com os dados informados anteriormente.\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n2. Logo após isso, é só iniciar a aplicação e o próprio hibernate criará as tabelas necessárias. Assim\nque subir é só testar os endpoints:\n\n- /users - **GET**\n- /users/{id} - **GET**\n- /users - **POST**\n\n- /departments - **GET**\n- /departments/{id} - **GET**\n- /departments - **POST**\n\n\u003cbr\u003e\n\u003cbr\u003e\n\n\u003e Os posts esperam um body em json, estes só contém o atributo name. Exemplo:\n\n\n\n    { \n      \"name\": \"Roberto\"\n    }\n\n\u003e **A Collection estará disponível junto do código fonte na raiz do projeto.**\n\n## Tecnologias utilizadas\n\n- Java 17\n- Spring Boot 3.1.1\n- Lombok\n- MySQL\n- PostgreSQL\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertoscolar%2Fmultiple-datasources-spring-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobertoscolar%2Fmultiple-datasources-spring-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertoscolar%2Fmultiple-datasources-spring-config/lists"}