`
wiselyman
  • 浏览: 2080914 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:81079
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130130
社区版块
存档分类
最新评论

Spring Boot,Spring Data JPA多数据源支持

 
阅读更多

1 配置文件

wisely.primary.datasource.driverClassName=oracle.jdbc.OracleDriver
wisely.primary.datasource.url=jdbc\:oracle\:thin\:@192.168.1.103\:1521\:xe
wisely.primary.datasource.username=gis
wisely.primary.datasource.password=gis
 
wisely.secondary.datasource.driverClassName=oracle.jdbc.OracleDriver
wisely.secondary.datasource.url=jdbc\:oracle\:thin\:@192.168.1.103\:1522\:xe
wisely.secondary.datasource.username=gis
wisely.secondary.datasource.password=gis

 

2 datasource配置

第一个数据源

@Configuration
public class DataSourcePrimaryConfig {

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

}

 

第二个数据源

@Configuration
public class DataSourceSecondaryConfig {
	@Bean(name = "secondaryDS") @Qualifier("secondaryDS")
	@ConfigurationProperties(prefix="wisely.secondary.datasource")
	public DataSource secondaryDataSource(){
		return DataSourceBuilder.create().build();
	}
}

 

3 实体管理器及事务管理器配置

第一个数据源

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "com.wisely.demo.dao.one" })//设置dao(repo)所在位置
public class RepositoryPrimaryConfig {
	  @Autowired
	  private JpaProperties jpaProperties;

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

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

	  @Bean(name = "entityManagerFactoryPrimary")
	  @Primary
	  public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {
	      return builder
	              .dataSource(primaryDS)
	              .properties(getVendorProperties(primaryDS))
	              .packages("com.wisely.demo.domain.one") //设置实体类所在位置
	              .persistenceUnit("primaryPersistenceUnit")
	              .build();
	  }

	  private Map<String, String> getVendorProperties(DataSource dataSource) {
	      return jpaProperties.getHibernateProperties(dataSource);
	  }

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

}

 

第二个数据源

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySecondary",transactionManagerRef="transactionManagerSecondary",basePackages= { "com.wisely.demo.dao.two" })
public class RepositorySecondaryConfig {
	  @Autowired
	  private JpaProperties jpaProperties;

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

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

	  @Bean(name = "entityManagerFactorySecondary")
	  public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary (EntityManagerFactoryBuilder builder) {
	      return builder
	              .dataSource(secondaryDS)
	              .properties(getVendorProperties(secondaryDS))
	              .packages("com.wisely.demo.domain.two")
	              .persistenceUnit("secondaryPersistenceUnit")
	              .build();
	  }

	  private Map<String, String> getVendorProperties(DataSource dataSource) {
	      return jpaProperties.getHibernateProperties(dataSource);
	  }

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

}

 

4 使用

此时来自不同数据库的dao(repo)可以任意在其它的bean里注入

 

@Controller
public class TestController {
	@Autowired
	SysRoleRepo1 sysRoleRepo1;
	@Autowired
	SysRoleRepo2 sysRoleRepo2;
	@RequestMapping("/test")
	public @ResponseBody String test(){
		System.out.println(Lists.newArrayList(sysRoleRepo1.findAll()).size());
		System.out.println(Lists.newArrayList(sysRoleRepo2.findAll()).size());
		return "ok";
	} 
}

 

 

新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。

 

京东地址:http://item.jd.com/11894632.html

当当地址:http://product.dangdang.com/23926195.html

亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6 

淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail

 

 

 

或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。

 


1
0
分享到:
评论
7 楼 zzb7728317 2017-08-01  
jjianwen68 写道
使用两个configuration来分别配置db是可以的,但是,如果直接在一个地方配置可以吗?类似这个链接https://gist.github.com/pascaldimassimo/cacad7ae4d41354f7337,我试了,总是不行,有时回报第二个db的entiy没有被管理到,有时候又报transactonmanager错误

你后来是怎么解决的,我现在也是第二个数据源根本不扫面对应的配置的package的entity。一直是第一个数据源在管理entity。烦死了
6 楼 iorixxxxx 2016-08-17  
按照上面的操作,运行出现找不到驱动,maven中已经引入驱动包了。Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath。
楼主能将多数据库代码分享一下吗,spring boot实战的书中也没讲这一段。
5 楼 smaer 2016-06-08  
不同的数据库这样配置也行么,比如一个为mysql,一个为oracle,jpa的通用配置那要在那配置呢
4 楼 jjianwen68 2015-09-07  
使用两个configuration来分别配置db是可以的,但是,如果直接在一个地方配置可以吗?类似这个链接https://gist.github.com/pascaldimassimo/cacad7ae4d41354f7337,我试了,总是不行,有时回报第二个db的entiy没有被管理到,有时候又报transactonmanager错误
3 楼 badboy1991 2015-07-09  
wiselyman 写道
badboy1991 写道
感觉这样的话,实现读写分离是不是很麻烦?


没大明白你的意思


上面这份配置只能做到bean级别的分库,但做不到方法级别的分库,比如说,我对于book的操作,插入和更新,我希望放在master上,读取数据希望放在slave上,这种感觉要实现很困难
2 楼 wiselyman 2015-07-09  
badboy1991 写道
感觉这样的话,实现读写分离是不是很麻烦?


没大明白你的意思
1 楼 badboy1991 2015-07-09  
感觉这样的话,实现读写分离是不是很麻烦?

相关推荐

Global site tag (gtag.js) - Google Analytics