今天临下班时遇到了一个需求,我的管理平台需要从不同的数据库中获取数据信息,这就需要进行弹簧的多数据源配置,对于这种配置,第一次永远都是痛苦的,不过经历了这次的折磨,今后肯定会对这种配置印象深刻。我们这里简单回顾一下流程。
我们配置了两个数据库,一个是公司的数据库,另一个是我本地的一个数据库。首先是application.yml的配置(其中对于公司的数据库我们采取了假的地址,而本机的数据库是真是存在对应的表和库的)
数据库信息:
数据表信息:
1, application.yml
数据源: 主: url: jdbc: mysql://companyurl.com: 5002/db1 用户名:unameq 密码:passwd1 driver-class-name: com.mysql.jdbc.Driver 二级: url: jdbc: mysql://localhost: 3306/django_test 用户名:根 密码:123456 driver-class-name: com.mysql.jdbc.Driver jpa: 数据库平台:org.hibernate.dialect.MySQL5Dialect hibernate: ddl-auto:更新 show-sql:真
2,创建总的数据源配置文件以及两个Repostory的配置文件PrimaryConfig以及SecondaryConfig
DataSourceConfig
@ configuration 公开课DataSourceConfig { @ bean (name=" primaryDataSource ") @ qualifier (“primaryDataSource”) @ConfigurationProperties(前缀=皊pring.datasource.primary”)//对应的数据库配置信息 公共数据源primaryDataSource () { .build返回DataSourceBuilder.create () (); } @ bean (name=" secondaryDataSource ") @ qualifier (“secondaryDataSource”) @Primary @ConfigurationProperties(前缀=皊pring.datasource.secondary”) 公共数据源secondaryDataSource () { .build返回DataSourceBuilder.create () (); } }
PrimaryConfig
@ configuration @EnableTransactionManagement @EnableJpaRepositories ( entityManagerFactoryRef=" entityManagerFactoryPrimary ", transactionManagerRef=" transactionManagerPrimary ", basePackages={"数据访问层所在的包"})//设置库所在位置 公开课PrimaryConfig { @ autowired @ qualifier (“primaryDataSource”) 私人数据源primaryDataSource; @Primary @ bean (name=" entityManagerPrimary ") 公共EntityManager EntityManager (EntityManagerFactoryBuilder builder) { .createEntityManager返回entityManagerFactoryPrimary (builder) .getObject () (); } @Primary @ bean (name=" entityManagerFactoryPrimary ") 公共LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) { 恢复建设者 .dataSource (primaryDataSource) . properties (getVendorProperties (primaryDataSource)) .packages(“实体类所在的包”)//设置实体类所在位置 .persistenceUnit (“primaryPersistenceUnit”) .build (); } @ autowired 私人JpaProperties JpaProperties; 私人Map<字符串,String>getVendorProperties数据源(DataSource) { 返回jpaProperties.getHibernateProperties(数据源); } @Primary @ bean (name=" transactionManagerPrimary ") 公共PlatformTransactionManager transactionManagerPrimary (EntityManagerFactoryBuilder builder) { 返回新JpaTransactionManager (entityManagerFactoryPrimary (builder) .getObject ()); } }
SecondaryConfig
@ configuration @EnableTransactionManagement @EnableJpaRepositories ( entityManagerFactoryRef=" entityManagerFactorySecondary ", transactionManagerRef=" transactionManagerSecondary ", basePackages={"数据访问层所在的包"})//设置库所在位置 公开课SecondaryConfig { @ autowired @ qualifier (“secondaryDataSource”) 私人数据源secondaryDataSource; @ bean (name=" entityManagerSecondary ") 公共EntityManager EntityManager (EntityManagerFactoryBuilder builder) { .createEntityManager返回entityManagerFactorySecondary (builder) .getObject () (); } @ bean (name=" entityManagerFactorySecondary ") 公共LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) { 恢复建设者 .dataSource (secondaryDataSource) . properties (getVendorProperties (secondaryDataSource)) .packages(“实体类所在的包”)//设置实体类所在位置 .persistenceUnit (“secondaryPersistenceUnit”) .build (); } @ autowired 私人JpaProperties JpaProperties; 私人Map弹簧+ Jpa多数据源配置的方法示例