溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot+Jpa多數(shù)據(jù)源配置的示例分析

發(fā)布時(shí)間:2021-08-20 13:43:51 來(lái)源:億速云 閱讀:165 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹了Spring Boot+Jpa多數(shù)據(jù)源配置的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

步驟

1.application.yml文件中,配置數(shù)據(jù)庫(kù)源。這里primary是主庫(kù),secondary是從庫(kù)。

server:
 port: 8089

# 多數(shù)據(jù)源配置
#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.創(chuàng)建一個(gè)Spring配置類(lèi),其中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.分別創(chuàng)建主庫(kù)、從庫(kù)的配置類(lèi)。

注意:entity包和dao包的配置,以及@Primary注解指定主庫(kù)。

主庫(kù)配置類(lèi):

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactoryPrimary",
  transactionManagerRef = "transactionManagerPrimary",
  basePackages = {"com.infinitus.yunxiao_data.dao.primary"}) //設(shè)置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") //設(shè)置實(shí)體類(lèi)所在位置
    .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());
 }
}

從庫(kù)的配置類(lèi):

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
  entityManagerFactoryRef = "entityManagerFactorySecondary",
  transactionManagerRef = "transactionManagerSecondary",
  basePackages = {"com.infinitus.yunxiao_data.dao.secondary"}) //設(shè)置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") //設(shè)置實(shí)體類(lèi)所在位置
    .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.分別創(chuàng)建主、從庫(kù)dao類(lèi)。

主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.分別創(chuàng)建主、從庫(kù)entity類(lèi)。

主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請(qǐng)求獲取不同數(shù)據(jù)庫(kù)的數(shù)據(jù)。

@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();
 }

}

注意

下面提兩個(gè)在配置多數(shù)據(jù)源時(shí)遇到的坑點(diǎn),一不注意就掉坑了。

1.Application類(lèi)不需要配置@EnableJpaRepositories注解,會(huì)報(bào)如下錯(cuò)誤。

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

2.注意檢查dao類(lèi),獲取數(shù)據(jù)的方法上格式是否正確,有沒(méi)有某個(gè)字段是表中不存在的,避免啟動(dòng)異常。如下,SecondaryEntity表中是不存在job_name字段的,所以注釋掉才能啟動(dòng)成功等。

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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Boot+Jpa多數(shù)據(jù)源配置的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI