温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring Boot+Jpa多数据源配置的示例分析

发布时间:2021-08-20 13:43:51 来源:亿速云 阅读:171 作者:小新 栏目:编程语言

这篇文章主要介绍了Spring Boot+Jpa多数据源配置的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

步骤

1.application.yml文件中,配置数据库源。这里primary是主库,secondary是从库。

server:
 port: 8089

# 多数据源配置
#primary
spring:
 primary:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/database1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
  username: root
  password: ******
  driver-class-name: com.mysql.jdbc.Driver

 #secondary
 secondary:
 datasource:
  url: jdbc:mysql://127.0.0.1:3306/database1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
  username: root
  password: ******
  driver-class-name: com.mysql.jdbc.Driver

 jpa:
 hibernate:
  primary-dialect: org.hibernate.dialect.MySQL5Dialect
  secondary-dialect: org.hibernate.dialect.MySQL5Dialect
 open-in-view: true
 show-sql: true

2.创建一个Spring配置类,其中spring.primary.datasource的路径参考yml文件的配置。

@Configuration
public class DataSourceConfig {

 @Bean(name = "primaryDataSource")
 @Qualifier("primaryDataSource")
 @ConfigurationProperties(prefix="spring.primary.datasource")
 public DataSource primaryDataSource() {
  return DataSourceBuilder.create().build();
 }

 @Bean(name = "secondaryDataSource")
 @Qualifier("secondaryDataSource")
 @Primary
 @ConfigurationProperties(prefix="spring.secondary.datasource")
 public DataSource secondaryDataSource() {
  return DataSourceBuilder.create().build();
 }

}

3.分别创建主库、从库的配置类。

注意:entity包和dao包的配置,以及@Primary注解指定主库。

主库配置类:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactoryPrimary",
  transactionManagerRef = "transactionManagerPrimary",
  basePackages = {"com.infinitus.yunxiao_data.dao.primary"}) //设置Repository所在位置
public class PrimaryConfig {
 @Autowired
 private JpaProperties jpaProperties;

 @Autowired
 @Qualifier("primaryDataSource")
 private DataSource primaryDataSource;

 @Primary
 @Bean(name = "entityManagerPrimary")
 public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
 }

 @Primary
 @Bean(name = "entityManagerFactoryPrimary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
  return builder
    .dataSource(primaryDataSource)
    .properties(getVendorProperties(primaryDataSource))
    .packages("com.infinitus.yunxiao_data.entity.primary") //设置实体类所在位置
    .persistenceUnit("primaryPersistenceUnit")
    .build();
 }


 private Map getVendorProperties(DataSource dataSource) {
  return jpaProperties.getHibernateProperties(dataSource);
 }

 @Primary
 @Bean(name = "transactionManagerPrimary")
 public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
  return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
 }
}

从库的配置类:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactorySecondary",
  transactionManagerRef = "transactionManagerSecondary",
  basePackages = {"com.infinitus.yunxiao_data.dao.secondary"}) //设置Repository所在位置
public class SecondaryConfig {
 @Autowired
 private JpaProperties jpaProperties;

 @Autowired
 @Qualifier("secondaryDataSource")
 private DataSource secondaryDataSource;

 @Bean(name = "entityManagerSecondary")
 public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  return entityManagerFactorySecondary(builder).getObject().createEntityManager();
 }

 @Bean(name = "entityManagerFactorySecondary")
 public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) {
  return builder
    .dataSource(secondaryDataSource)
    .properties(getVendorProperties(secondaryDataSource))
    .packages("com.infinitus.yunxiao_data.entity.secondary") //设置实体类所在位置
    .persistenceUnit("primaryPersistenceUnit")
    .build();
 }


 private Map getVendorProperties(DataSource dataSource) {
  return jpaProperties.getHibernateProperties(dataSource);
 }

 @Bean(name = "transactionManagerSecondary")
 PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
  return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
 }

}

4.分别创建主、从库dao类。

主dao:

@Repository
public interface PrimaryRepository extends JpaRepository<PrimaryEntity, Long> {

 @Query(value = "SELECT p FROM PrimaryEntity p")
 List<PrimaryEntity> queryList();

}

从dao:

@Repository
public interface SecondaryRepository extends JpaRepository<SecondaryEntity, Long> {

 @Query(value = "SELECT p FROM SecondaryEntity p")
 List<SecondaryEntity> queryList();

}

5.分别创建主、从库entity类。

主entity:

@Entity
@Table(name = "holiday_scheme")
@EntityListeners(AuditingEntityListener.class)
public class PrimaryEntity extends AbstractPersistable<Long> {
 @Column(name = "date")
 public String date;
 @Column(name = "hour")
 public String hour;
 @Column(name = "holiday")
 public String holiday;
 @Column(name = "holiday_explain")
 public String holiday_explain;

 public String getDate() {
  return date;
 }

 public void setDate(String date) {
  this.date = date;
 }

 public String getHour() {
  return hour;
 }

 public void setHour(String hour) {
  this.hour = hour;
 }

 public String getHoliday() {
  return holiday;
 }

 public void setHoliday(String holiday) {
  this.holiday = holiday;
 }

 public String getHoliday_explain() {
  return holiday_explain;
 }

 public void setHoliday_explain(String holiday_explain) {
  this.holiday_explain = holiday_explain;
 }

 @Override
 public String toString() {
  return "PrimaryEntity{" +
    "date='" + date + '\'' +
    ", hour='" + hour + '\'' +
    ", holiday='" + holiday + '\'' +
    ", holiday_explain='" + holiday_explain + '\'' +
    '}';
 }
}

从entity:

@Entity
@Table(name = "active_dashboards")
@EntityListeners(AuditingEntityListener.class)
public class SecondaryEntity extends AbstractPersistable<Long> {

 @Column(name = "dashboard_id")
 public String dashboard_id;
 @Column(name = "user_id")
 public String user_id;
 @Column(name = "order_index")
 public String order_index;

 public String getDashboard_id() {
  return dashboard_id;
 }

 public void setDashboard_id(String dashboard_id) {
  this.dashboard_id = dashboard_id;
 }

 public String getUser_id() {
  return user_id;
 }

 public void setUser_id(String user_id) {
  this.user_id = user_id;
 }

 public String getOrder_index() {
  return order_index;
 }

 public void setOrder_index(String order_index) {
  this.order_index = order_index;
 }

 @Override
 public String toString() {
  return "SecondaryEntity{" +
    "dashboard_id='" + dashboard_id + '\'' +
    ", user_id='" + user_id + '\'' +
    ", order_index='" + order_index + '\'' +
    '}';
 }
}

6.controller请求获取不同数据库的数据。

@RestController
@RequestMapping("/database")
public class MailController {
 private final Logger logger = LoggerFactory.getLogger(this.getClass());

 @Autowired
 PrimaryRepository primaryRepository;
 @Autowired
 SecondaryRepository secondaryRepository;

 @RequestMapping("/primary")
 @ResponseBody
 public String primary() {
  return primaryRepository.queryList().toString();
 }

 @RequestMapping("/secondary")
 @ResponseBody
 public String secondary() {
  return secondaryRepository.queryList().toString();
 }

}

注意

下面提两个在配置多数据源时遇到的坑点,一不注意就掉坑了。

1.Application类不需要配置@EnableJpaRepositories注解,会报如下错误。

A component required a bean named 'entityManagerFactory' that could not be f

2.注意检查dao类,获取数据的方法上格式是否正确,有没有某个字段是表中不存在的,避免启动异常。如下,SecondaryEntity表中是不存在job_name字段的,所以注释掉才能启动成功等。

//@Query(value = "SELECT p FROM SecondaryEntity p where p.job_name = ?1")
//List<SecondaryEntity> queryOdcRecord(String job_name);

感谢你能够认真阅读完这篇文章,希望小编分享的“Spring Boot+Jpa多数据源配置的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI