Spring Boot多資料來源配置(一)durid、mysql、jpa整合
阿新 • • 發佈:2019-01-05
目前在做一個統計專案。需要多資料來源整合,其中包括mysql和mongo。本節先講mysql、durid、jpa與spring-boot的整合。
引入Durid包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
配置檔案
spring:
#mysql配置
datasource:
user:
url: jdbc:mysql://192.168 .1.252/kxlist_user?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
product:
url: jdbc:mysql://192.168.1.252/kxlist_product?characterEncoding=utf-8&useSSL=false
username: root
password: 123456
driver-class-name: com .mysql.jdbc.Driver
#jpa配置
jpa:
database: mysql
database-platform: org.hibernate.dialect.MySQL5Dialect
show-sql: true
hibernate:
ddl-auto: update
JAVA檔案
- 總的配置:
通過@Primary
表示主資料來源。
@Configuration
public class DruidDataSourceConfig {
@Bean(name="userDataSource")
@Primary
@ConfigurationProperties(prefix="spring.datasource.user")
public DataSource primaryDataSource() {
System.out.println("-------------------- userDataSource init ---------------------");
return new DruidDataSource();
}
@Bean(name="productDataSource")
@ConfigurationProperties(prefix="spring.datasource.product")
public DataSource secondaryDataSource() {
System.out.println("-------------------- productDataSource init ---------------------");
return new DruidDataSource();
}
}
- user資料來源的配置:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="userEntityManagerFactory",
transactionManagerRef="userTransactionManager",
basePackages= { "com.kxlist.statistics.domain.user" }) //設定Repository所在位置
public class UserDataSourceConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("userDataSource")
private DataSource userDataSource;
/**
* 我們通過LocalContainerEntityManagerFactoryBean來獲取EntityManagerFactory例項
* @return
*/
@Bean(name = "userEntityManagerFactoryBean")
//@Primary
public LocalContainerEntityManagerFactoryBean userEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(userDataSource)
.properties(getVendorProperties(userDataSource))
.packages("com.kxlist.statistics.domain.user") //設定實體類所在位置
.persistenceUnit("userPersistenceUnit")
.build();
//.getObject();//不要在這裡直接獲取EntityManagerFactory
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
/**
* EntityManagerFactory類似於Hibernate的SessionFactory,mybatis的SqlSessionFactory
* 總之,在執行操作之前,我們總要獲取一個EntityManager,這就類似於Hibernate的Session,
* mybatis的sqlSession.
* @param builder
* @return
*/
@Bean(name = "userEntityManagerFactory")
@Primary
public EntityManagerFactory userEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return this.userEntityManagerFactoryBean(builder).getObject();
}
/**
* 配置事物管理器
* @return
*/
@Bean(name = "userTransactionManager")
@Primary
public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(userEntityManagerFactory(builder));
}
}
注意:LocalContainerEntityManagerFactoryBean
和userEntityManagerFactory
方法其中一個註解@Primary
即可,不然啟動會報錯。
- product資料來源的配置
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="productEntityManagerFactory",
transactionManagerRef="productTransactionManager",
basePackages= { "com.kxlist.statistics.domain.product" }) //設定Repository所在位置
public class ProductDataSourceConfig {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("productDataSource")
private DataSource productDataSource;
/**
* 我們通過LocalContainerEntityManagerFactoryBean來獲取EntityManagerFactory例項
* @return
*/
@Bean(name = "productEntityManagerFactoryBean")
public LocalContainerEntityManagerFactoryBean productEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(productDataSource)
.properties(getVendorProperties(productDataSource))
.packages("com.kxlist.statistics.domain.product") //設定實體類所在位置
.persistenceUnit("productPersistenceUnit")
.build();
//.getObject();//不要在這裡直接獲取EntityManagerFactory
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
/**
* EntityManagerFactory類似於Hibernate的SessionFactory,mybatis的SqlSessionFactory
* 總之,在執行操作之前,我們總要獲取一個EntityManager,這就類似於Hibernate的Session,
* mybatis的sqlSession.
* @param builder
* @return
*/
@Bean(name = "productEntityManagerFactory")
public EntityManagerFactory productEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return this.productEntityManagerFactoryBean(builder).getObject();
}
/**
* 配置事物管理器
* @return
*/
@Bean(name = "productTransactionManager")
public PlatformTransactionManager writeTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(productEntityManagerFactory(builder));
}
}
依照程式碼在相對應的包下建實體類和Repository即可。
至此,spring-boot與mysql多資料來源的整合已經結束。