SpringBoot 项目配置多数据源
如果需要在同一个Spring Boot应用程序中同时使用PostgreSQL和Oracle数据库,你可以配置多个数据源来实现这一目标。
添加依赖
dependencies { implementation 'org.postgresql:postgresql:42.3.1' implementation 'com.oracle.database.jdbc:ojdbc8:19.3.0.0' //其他依赖项 }
配置文件
spring: primary: datasource: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql://localhost:5432/nap username: xxx password: xxx test-on-borrow: true validationQuery: SELECT 1 name: HikariPool-1 minimum-idle: 15 maximum-pool-size: 30 idle-timeout: 600000 max-lefetime: 1800000 connection-timeout: 30000 secondary: datasource: driver-class-name: oracle.jdbc.OracleDriver jdbc-url: jdbc:oracle:thin:@//localhost:1521/odrd username: xxx password: xxx test-on-borrow: true validationQuery: SELECT 1 name: HikariPool-2 minimum-idle: 15 maximum-pool-size: 30 idle-timeout: 600000 max-lefetime: 1800000 connection-timeout: 30000
数据源配置
/** * 数据源的配置 */ @Configuration public class DataSourceConfig { private static Logger logger = LoggerFactory.getLogger(DataSourceConfig.class); @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.primary.datasource") @Primary public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.secondary.datasource") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "primaryJdbcTemplate") @Primary public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) { return new JdbcTemplate(primaryDataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) { return new JdbcTemplate(secondaryDataSource); } }
配置实体管理
配置完数据源之后,还需要配置一些额外的东西,例如实体
和Repository
的包路径,hibernate
以及实体管理器
等一系列需要的bean
/** * 数据源一 */ @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = {"net.skycloud.mtkadaptor.basedata.repository", "net.skycloud.mtkadaptor.order.repository", "net.skycloud.mtkadaptor.subnet.repository","net.skycloud.mtkadaptor.user.repository"}) //设置Repository所在位置 public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return Objects.requireNonNull(entityManagerFactoryPrimary(builder).getObject()).createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryPrimary") //设置实体所在包 public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) { return builder.dataSource(primaryDataSource) .properties(getVendorProperties()) .packages("net.skycloud.mtkadaptor.basedata.model", "net.skycloud.mtkadaptor.order.model", "net.skycloud.mtkadaptor.subnet.model","net.skycloud.mtkadaptor.user.model","net.skycloud.common.model") .persistenceUnit("primaryPersistenceUnit") .build(); } //配置hibernate信息 方言等 private Map<String, String> getVendorProperties() { Map<String, String> jpaProperties = new HashMap<>(16); jpaProperties.put("hibernate.hbm2ddl.auto", "none"); jpaProperties.put("hibernate.show_sql", "false"); jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); jpaProperties.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName()); jpaProperties.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());; return jpaProperties; } @Primary @Bean(name = "transactionManagerPrimary") //配置事物管理器 public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }
/** * 数据源二 */ @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary", transactionManagerRef = "transactionManagerSecondary", basePackages = {"net.skycloud.mtkadaptor.odr"}) public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean(name = "entityManagerSecondary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return Objects.requireNonNull(entityManagerFactorySecondary(builder).getObject()).createEntityManager(); } @Bean(name = "entityManagerFactorySecondary") public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) { return builder.dataSource(secondaryDataSource) .properties(getVendorProperties(secondaryDataSource)) .packages("net.skycloud.mtkadaptor.odr") .persistenceUnit("secondaryPersistenceUnit") .build(); } private Map<String, String> getVendorProperties(DataSource dataSource) { Map<String, String> jpaProperties = new HashMap<>(16); jpaProperties.put("hibernate.hbm2ddl.auto", "none"); jpaProperties.put("hibernate.show_sql", "false"); jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect"); return jpaProperties; } @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }
配置好之后,你就可以在对应的包下面开发Entity
和Repository
了,至此多数据源的配置就完成了。
-
java
-
Springboot
-
数据库
群除我佬
项目依赖管理用的gradle嘛

看着确实比maven舒服好多
什么年代了,18年起就一直用gradle了
这不都是些很简单的东西吗,只是没人整理
果然是大佬,我这小破公司一直都是maven
俺 前端菜狗一个
俺 前端菜狗一个
群除我佬
猫猫教我前端
群除我佬
不会 只会一点html
有用的知识增加了
为什么不是奇怪的知识,这些我都知道了
多强哦
膜拜
maven的确更主流一点,基本接触的开源的开源项目都是maven, 不过dsl的语义化更好,更喜欢用gradle
666
群除我佬
大GGnb!
好,专业!
派除我佬