Springboot+jpa多数据源


修改配置文件
spring:
  application:
    name: cms
  primaryDataSource:
    dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    url:jdbc:mysql://localhost:3306/srbairun?useUnicode=true&characterEncoding=utf-8
    username: 123
    password: 123
    poolName: StringBootHikariCP
    maximumPoolSize: 10
    minimumIdle: 3
    maxLifetime: 2000000
    connectionTimeout: 30000
    idleTimeout: 30000
    pool-prepared-statements: true
    max-open-prepared-statements: 300
  secondaryDatasource:
    dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    url: jdbc:mysql://localhost:5866/test?useUnicode=true&characterEncoding=utf-8
    username: 123
    password: 123
    poolName: StringBootHikariCP
    maximumPoolSize: 10
    minimumIdle: 3
    maxLifetime: 2000000
    connectionTimeout: 30000
    idleTimeout: 30000
    pool-prepared-statements: true
    max-open-prepared-statements: 300
增加数据源配置
主数据源配置:
/**
 * 数据源设置
 * @author rongxj
 *
 */
@Configuration
@ComponentScan
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",  
    transactionManagerRef="transactionManagerPrimary",  
    basePackages={"com.ido85","com.ido85.bairun.master","com.ido85.frame","com.ido85.sso.security"}) 
public class PrimaryDataSourceConfiguration {

@Value("${spring.primaryDataSource.username}")
private String user;

@Value("${spring.primaryDataSource.password}")
private String password;

@Value("${spring.primaryDataSource.url}")
private String dataSourceUrl;

@Value("${spring.primaryDataSource.dataSourceClassName}")
private String dataSourceClassName;

@Value("${spring.primaryDataSource.poolName}")
private String poolName;

@Value("${spring.primaryDataSource.connectionTimeout}")
private int connectionTimeout;

@Value("${spring.primaryDataSource.maxLifetime}")
private int maxLifetime;

@Value("${spring.primaryDataSource.maximumPoolSize}")
private int maximumPoolSize;

@Value("${spring.primaryDataSource.minimumIdle}")
private int minimumIdle;

@Value("${spring.primaryDataSource.idleTimeout}")
private int idleTimeout;

@Value("${spring.primaryDataSource.sqlScriptEncoding}")
private String encode;

@Value("${spring.jpa.multitenant.default-id}")
private String defaultTenantId;

@Value("${spring.primaryDataSource.connectionInitSqls}")
private String connectionInitSqls;

@Bean
@Primary  
public DataSource primaryDataSource() {
Properties dsProps = new Properties();
dsProps.put("url", dataSourceUrl);
dsProps.put("user", user);
dsProps.put("password", password);
dsProps.put("prepStmtCacheSize", 250);
dsProps.put("prepStmtCacheSqlLimit", 2048);
dsProps.put("cachePrepStmts", Boolean.TRUE);
dsProps.put("useServerPrepStmts", Boolean.TRUE);

Properties configProps = new Properties();
configProps.put("dataSourceClassName", dataSourceClassName);
configProps.put("poolName", poolName);
configProps.put("maximumPoolSize", maximumPoolSize);
configProps.put("minimumIdle", minimumIdle);
configProps.put("minimumIdle", minimumIdle);
configProps.put("connectionTimeout", connectionTimeout);
configProps.put("idleTimeout", idleTimeout);
configProps.put("dataSourceProperties", dsProps);
configProps.put("connectionInitSql", connectionInitSqls);
HikariConfig hc = new HikariConfig(configProps);
HikariDataSource ds = new HikariDataSource(hc);
return ds;
}

@Bean(name="entityManagerFactoryPrimary")  
    @Primary 
    public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(DataSource dataSource, JpaProperties jpaProperties) {  
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource);
// jpaProperties.getProperties().put("hibernate." + "ejb.naming_strategy_delegator", "none");
factory.setJpaPropertyMap(jpaProperties.getProperties());
factory.setPackagesToScan("com.ido85");
factory.setPersistenceProviderClass(HibernatePersistenceProvider.class);
factory.setPersistenceUnitName("system");
factory.afterPropertiesSet();
return factory;
    }

@Bean(name = "transactionManagerPrimary")
@DependsOn("entityManagerFactoryPrimary")
@Primary
    PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactoryPrimary") LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary) {  
        return new JpaTransactionManager(entityManagerFactoryPrimary.getObject());  
    }

@Bean(name = "idGenerator")
    IdGenerator idGenerator() {  
        return new DistributedIdGenerator(1l);  
    }
}


副数据源配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySecondary",
transactionManagerRef = "transactionManagerSecondary", 
basePackages = "com.ido85.bairun.msg")
public class SecondaryDataSourceConfiguration {

@Value("${spring.secondaryDatasource.username}")
private String user;

@Value("${spring.secondaryDatasource.password}")
private String password;

@Value("${spring.secondaryDatasource.url}")
private String dataSourceUrl;

@Value("${spring.secondaryDatasource.dataSourceClassName}")
private String dataSourceClassName;

@Value("${spring.secondaryDatasource.poolName}")
private String poolName;

@Value("${spring.secondaryDatasource.connectionTimeout}")
private int connectionTimeout;

@Value("${spring.secondaryDatasource.maxLifetime}")
private int maxLifetime;

@Value("${spring.secondaryDatasource.maximumPoolSize}")
private int maximumPoolSize;

@Value("${spring.secondaryDatasource.minimumIdle}")
private int minimumIdle;

@Value("${spring.secondaryDatasource.idleTimeout}")
private int idleTimeout;

@Value("${spring.jpa.multitenant.default-id}")
private String defaultTenantId;
@Value("${spring.primaryDataSource.connectionInitSqls}")
private String connectionInitSqls;

@Bean(name = "secondaryDataSource")
public DataSource secondaryDataSource() {
Properties dsProps = new Properties();
dsProps.put("url", dataSourceUrl);
dsProps.put("user", user);
dsProps.put("password", password);
dsProps.put("prepStmtCacheSize", 250);
dsProps.put("prepStmtCacheSqlLimit", 2048);
dsProps.put("cachePrepStmts", Boolean.TRUE);
dsProps.put("useServerPrepStmts", Boolean.TRUE);

Properties configProps = new Properties();
configProps.put("dataSourceClassName", dataSourceClassName);
configProps.put("poolName", poolName);
configProps.put("maximumPoolSize", maximumPoolSize);
configProps.put("minimumIdle", minimumIdle);
configProps.put("minimumIdle", minimumIdle);
configProps.put("connectionTimeout", connectionTimeout);
configProps.put("idleTimeout", idleTimeout);
configProps.put("dataSourceProperties", dsProps);
configProps.put("connectionInitSql", connectionInitSqls);
HikariConfig hc = new HikariConfig(configProps);
HikariDataSource ds = new HikariDataSource(hc);
return ds;
}


@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
@Qualifier("secondaryDataSource") DataSource dataSource,
JpaProperties jpaProperties) {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource);
factory.setJpaVendorAdapter(jpaVendorAdapter());
// jpaProperties.getProperties().put("hibernate.dialect",
// "org.hibernate.dialect.MySQLDialect");
// jpaProperties.getProperties().put("hibernate.multiTenancy",
// hibernateMultiTenancy);
// jpaProperties.getProperties().put(
// "hibernate.tenant_identifier_resolver",
// tenant_identifier_resolver);
// jpaProperties.getProperties().put(
// "hibernate.multi_tenant_connection_provider",
// multi_tenant_connection_provider);
Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",
"org.hibernate.dialect.MySQL5Dialect");
// properties.put(org.hibernate.cfg.Environment.MULTI_TENANT,
//                          MultiTenancyStrategy.SCHEMA);
// properties.put(org.hibernate.cfg.Environment.MULTI_TENANT_CONNECTION_PROVIDER,
//                          multiTenantConnectionProvider);
// properties.put(org.hibernate.cfg.Environment.MULTI_TENANT_IDENTIFIER_RESOLVER,
//                          tenantIdentifierResolver);
// properties.put(org.hibernate.cfg.Environment.IMPLICIT_NAMING_STRATEGY, "legacy-jpa");
// properties.put(org.hibernate.cfg.Environment.PHYSICAL_NAMING_STRATEGY, PhysicalNamingStrategyStandardImpl.INSTANCE);

// properties.put(org.hibernate.cfg.Environment.DEFAULT_SCHEMA,
// defaultTenant);

properties.put(org.hibernate.cfg.Environment.GENERATE_STATISTICS,
false);

factory.setJpaPropertyMap(properties);
factory.setPackagesToScan("com.ido85.bairun.msg");
factory.setPersistenceProviderClass(HibernatePersistenceProvider.class);
factory.setPersistenceUnitName("msg");
factory.setLoadTimeWeaver(new InstrumentationLoadTimeWeaver());
factory.afterPropertiesSet();
factory.setJpaVendorAdapter(jpaVendorAdapter());
return factory;
}

@Bean(name = "transactionManagerSecondary")
@DependsOn("entityManagerFactorySecondary")
PlatformTransactionManager transactionManagerSecondary(
@Qualifier("entityManagerFactorySecondary") LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory) {
return new JpaTransactionManager(
secondaryEntityManagerFactory.getObject());
}

@Bean
    public JpaVendorAdapter jpaVendorAdapter() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
   jpaVendorAdapter.setDatabase(Database.MYSQL);
//    jpaVendorAdapter.setGenerateDdl(true);
   return jpaVendorAdapter;
//        return new HibernateJpaVendorAdapter();
    }

}
注意@Primary注解的添加。
使用方式
    1.在上面basePackages 配置的扫描路径下的实体类,jpa资源类自动寻找对应的数据源。
2.如果使用EntityManager方法的话,@PersistenceContext(unitName = "msg")指定使用那个数据源,unitName是在上面数据源配置模块配置好的。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot是一个用于构建独立的、可执行的Spring应用程序的框架,简化了Spring应用程序的配置和部署。JPA(Java Persistence API)是一种用于管理Java对象和关系数据库之间映射的规范。Druid是阿里巴巴开源的关系型数据库连接池。 在Spring Boot中配置多数据源需要以下几步: 1. 引入相关依赖:需要引入Spring Boot、Spring Data JPA和Druid的相关依赖。 2. 配置数据源:在application.properties或application.yml文件中配置多个数据源的连接信息,并指定每个数据源的名称和相关属性。 3. 配置数据源连接池:使用@ConfigurationProperties注解创建多个数据源的连接池对象,并指定数据源的名称以及相关属性。 4. 配置实体管理器工厂:为每个数据源配置对应的实体管理器工厂,用于处理JPA实体与数据库之间的映射关系。 5. 配置事务管理器:为每个数据源配置对应的事务管理器,用于处理事务操作。 6. 配置数据源路由:创建动态数据源,根据传入的数据源名称选择对应的数据源进行操作。 7. 配置JPA的Repository:创建接口继承JpaRepository,用于定义数据访问方法。 通过以上步骤配置好多数据源后,就可以在Spring Boot应用程序中使用多个数据源进行数据库的操作。可以根据需要在Service或Controller中使用@PersistenceContext注解指定具体的数据源,或者使用@Primary注解指定默认的数据源。 总结:通过Spring Boot的自动配置和Druid的连接池,可以很方便地实现多数据源的配置。使用JPA进行数据操作,能够有效地减少开发人员编写SQL语句的工作量,提高开发效率。通过合理的配置,可以根据需要选择不同的数据源进行操作,实现灵活的数据访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值