SpringBoot構成JPAマルチデータソース
5957 ワード
SpringBootバージョン
バージョンによって構成方法が異なるかもしれませんが、SpringBoot 2を採用しています.0.4.RELEASE.
マルチデータソース構成
注:
Spring構成クラスを作成し、アプリケーションを読み込む2つのDataSourceを定義します.ymlにおける異なる配置は、上記yamlにおいてspring.datasource.primaryメインデータソース構成、spring.datasource.secondaryは第2のデータソース構成であり、コードは以下の通りである.
Spring-data-jpaサポート
第1データソースのJPA構成を追加
なお、指定データソースに対応する
第2データソースのJPA構成を追加
第2データソースの構成は第1データソースの構成と類似しており、コードは以下の通りである.
上記の構成が完了したら
プライマリ・データ・ソースのエンティティおよびデータ・アクセス・オブジェクトは、
セカンダリ・データ・ソースのエンティティおよびデータ・アクセス・オブジェクトは、
新しいエンティティークラスとRepository
プライマリ・データ・ソースの下に
セカンダリ・データ・ソースの下に
テスト
略
バージョンによって構成方法が異なるかもしれませんが、SpringBoot 2を採用しています.0.4.RELEASE.
マルチデータソース構成
application.yml
は次のように構成されています.spring:
application:
name: test
jpa:
hibernate:
ddl-auto: update
show-sql: true
datasource:
primary:
jdbc-url: jdbc:mysql://127.0.0.1:3306/laboratory
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
secondary:
jdbc-url: jdbc:mysql://127.0.0.1:3306/test
driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
注:
jdbc-url
プロパティは、前の構成のurl
プロパティの代わりに使用されます.Spring構成クラスを作成し、アプリケーションを読み込む2つのDataSourceを定義します.ymlにおける異なる配置は、上記yamlにおいてspring.datasource.primaryメインデータソース構成、spring.datasource.secondaryは第2のデータソース構成であり、コードは以下の通りである.
@Configuration
public class DataSourceConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource masterDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
}
Spring-data-jpaサポート
第1データソースのJPA構成を追加
なお、指定データソースに対応する
Entity
エンティティとRepository
で定義された位置は、@Primary
でマスターデータソースを区別し、コードは以下の通りである.@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryPrimary",
transactionManagerRef = "transactionManagerPrimary",
basePackages = {"cn.ntshare.laboratory.domain.master"}
)
public class PrimarySourceConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource;
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Resource
private Properties jpaProperties;
@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = builder
.dataSource(primaryDataSource)
.packages("cn.ntshare.laboratory.domain.master") //
.persistenceUnit("primaryPersistenceUnit")
.build();
entityManagerFactory.setJpaProperties(jpaProperties);
return entityManagerFactory;
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}
}
第2データソースのJPA構成を追加
第2データソースの構成は第1データソースの構成と類似しており、コードは以下の通りである.
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "cn.ntshare.laboratory.domain.slave" }) // Repository
public class SecondarySourceConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Bean(name = "entityManagerSecondary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactorySecondary(builder).getObject().createEntityManager();
}
@Resource
private Properties jpaProperties;
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean entityManagerFactory = builder
.dataSource(secondaryDataSource)
.packages("cn.ntshare.laboratory.domain.slave") //
.persistenceUnit("secondaryPersistenceUnit")
.build();
entityManagerFactory.setJpaProperties(jpaProperties);
return entityManagerFactory;
}
@Bean(name = "transactionManagerSecondary")
PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
上記の構成が完了したら
プライマリ・データ・ソースのエンティティおよびデータ・アクセス・オブジェクトは、
cn.ntshare.laboratory.domain.master
にあります.セカンダリ・データ・ソースのエンティティおよびデータ・アクセス・オブジェクトは、
cn.ntshare.laboratory.domain.slave
にあります.新しいエンティティークラスとRepository
プライマリ・データ・ソースの下に
MUser
とMUserRepository
を作成@Entity(name = "m_user")
@Getter
@Setter
@NoArgsConstructor
public class MUser {
@Id
@GeneratedValue
private Integer id;
private String username;
}
@Repository
public interface MUserRepository extends JpaRepository {
}
セカンダリ・データ・ソースの下に
SUser
とSUserRepository
を作成@Entity(name = "s_user")
@Getter
@Setter
@NoArgsConstructor
public class SUser {
@Id
@GeneratedValue
private Integer id;
private String username;
}
@Repository
public interface SUserRepository extends JpaRepository {
}
テスト
略