spring boot 已经支持多数据源配置了,无需网上好多那些编写什么类的,特别麻烦,看看如下解决方案,官方的,放心!

1.首先定义数据源配置
#=====================multiple database config============================ #ds1 first.datasource.url=jdbc:mysql://localhost/test?characterEncoding=utf8&useSSL=true first.datasource.username=root first.datasource.password=123456 first.datasource.driver-class-name=com.mysql.jdbc.Driver first.datasource.type=org.apache.tomcat.jdbc.pool.DataSource first.datasource.max-wait=10000 first.datasource.max-active=200 first.datasource.test-on-borrow=true first.datasource.initial-size=10 #ds2 second.datasource.url=jdbc:mysql://localhost/test2?characterEncoding=utf8&useSSL=true second.datasource.username=root second.datasource.password=123456 second.datasource.driver-class-name=com.mysql.jdbc.Driver second.datasource.type=org.apache.tomcat.jdbc.pool.DataSource second.datasource.max-wait=10000 second.datasource.max-active=200 second.datasource.test-on-borrow=true second.datasource.initial-size=10 #=====================jpa config================================ #实体类维护数据库表结构的具体行为:update/create/create-drop/validate/none spring.jpa.hibernate.ddl-auto=none #打印sql语句 spring.jpa.show-sql=true #格式化输出的json字符串 spring.jackson.serialization.indent_output=true
2.配置ds1的相关注入对象和启用jpa支持
/**
* Created by hdwang on 2017-06-16.
* 第一个数据源配置
* If you are using Spring Data, you need to configure @EnableJpaRepositories
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.firstDs",entityManagerFactoryRef = "firstEntityManagerFactory",transactionManagerRef="firstTransactionManager")
public class FirstDsConfig {
/**
* 数据源配置对象
* Primary 表示默认的对象,Autowire可注入,不是默认的得明确名称注入
* @return
*/
@Bean
@Primary
@ConfigurationProperties("first.datasource")
public DataSourceProperties firstDataSourceProperties() {
return new DataSourceProperties();
}
/**
* 数据源对象
* @return
*/
@Bean
@Primary
@ConfigurationProperties("first.datasource")
public DataSource firstDataSource() {
return firstDataSourceProperties().initializeDataSourceBuilder().build();
}
/**
* 实体管理对象
* @param builder 由spring注入这个对象,首先根据type注入(多个就取声明@Primary的对象),否则根据name注入
* @return
*/
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(firstDataSource())
.packages("com.hdwang.entity.dbFirst")
.persistenceUnit("firstDs")
.build();
}
/**
* 事务管理对象
* @return
*/
@Bean(name = "firstTransactionManager")
@Primary
public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
@Primary
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(firstDataSource());
}
@Bean
@Primary
public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
return new TransactionTemplate(platformTransactionManager);
}
}
相关知识点:
1.使用@Bean可以创建一个bean对象交给spring容器管理
2.@Bean创建的bean对象的名称默认为方法名,也可以指定
3.@Bean方法参数表示,接收一个bean对象,默认按照type类型接收注入的对象,若要修改为byName方式,可以使用@Qualifier注解注入准确的对象
4.@Primary表示该bean为此类型的默认bean,在其他地方引用的时候用@Autowired即可按照类型注入,不受同类型多个对象影响
5.EnableJpaRepositories表示启用spring data jpa的支持,也就是jpa的新使用方式,注意basePackages指的事 @Repository接口的所在包位置,可配置多个
其他注解就不清楚了!
2.配置ds2的相关注入对象和启用jpa支持
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.hdwang.dao.datajpa.secondDs", entityManagerFactoryRef = "secondEntityManagerFactory",transactionManagerRef = "secondTransactionManager")
public class SecondDsConfig {
@Bean
@ConfigurationProperties("second.datasource")
public DataSourceProperties secondDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("second.datasource")
public DataSource secondDataSource() {
return secondDataSourceProperties().initializeDataSourceBuilder().build();
}
/**
* 实体管理对象
* @param builder 由spring注入这个对象,首先根据type注入(多个就取声明@Primary的对象),否则根据name注入
* @return
*/
@Bean
public LocalContainerEntityManagerFactoryBean secondEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(secondDataSource())
.packages("com.hdwang.entity.dbSecond")
.persistenceUnit("secondDs")
.build();
}
/**
* 事物管理对象
* @param secondEntityManagerFactory 实体管理工厂对象(按照名称注入)
* @return 平台事物管理器
*/
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager transactionManager(@Qualifier("secondEntityManagerFactory")LocalContainerEntityManagerFactoryBean secondEntityManagerFactory){
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(secondEntityManagerFactory.getObject());
return transactionManager;
}
@Bean(name="jdbcTemplate2")
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(secondDataSource());
}
@Bean(name = "transactionTemplate2")
public TransactionTemplate transactionTemplate(@Qualifier("secondTransactionManager")PlatformTransactionManager transactionManager){
return new TransactionTemplate(transactionManager);
}
}
3.Repository数据持久层
package com.hdwang.dao.datajpa.firstDs;
@Repository
public interface UserRepository extends JpaRepository<User, Integer> {
/**
* spring data jpa 会自动注入实现(根据方法命名规范)
* @return
*/
User findByNumber(String number);
@Modifying
@Query("delete from User u where u.id = :id")
void deleteUser(@Param("id")int id);
}
package com.hdwang.dao.datajpa.secondDs;
@Repository
public interface OrderRepository extends JpaRepository<Order, Integer> {
/**
* spring data jpa 会自动注入实现(根据方法命名规范)
* @return
*/
User findByNumber(String number);
@Modifying
@Query("delete from Order o where o.id = :id")
void deleteUser(@Param("id") int id);
}
上面两个接口分属两个数据源,在@EnableJpaRepositories配置好后,这里就可以正确操作相应的数据源了
4.Service服务层,注意事物(接口我就不贴了)
@Service
@Transactional("firstTransactionManager")
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public User findById(int id) {
return this.userRepository.findOne(id);
}
@Override
public User findByNumber(String number) {
return this.userRepository.findByNumber(number);
}
@Override
public List<User> findAllUserByPage(int page,int size) {
Pageable pageable = new PageRequest(page, size);
Page<User> users = this.userRepository.findAll(pageable);
return users.getContent();
}
@Override
public User updateUser(User user,boolean throwEx) {
User userNew = this.userRepository.save(user);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return userNew;
}
@Override
public void deleteUser(int id) {
this.userRepository.deleteUser(id);
}
}
@Service
@Transactional("secondTransactionManager")
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderRepository orderRepository;
@Override
public Order findById(int id) {
return this.orderRepository.findOne(id);
}
@Override
public Order updateOrder(Order order, boolean throwEx) {
Order orderNew = this.orderRepository.save(order);
if(throwEx){
throw new RuntimeException("throw a ex");
}
return orderNew;
}
}
知识扩展
1.如果采用传统jpa方式,@EnableJpaRepositories无需配置,配置了也无影响。实现方式如下:
ds1相关DaoImpl
@PersistenceContext
private EntityManager entityManager;
ds2相关DaoImpl
@PersistenceContext(unitName = "secondDs")
private EntityManager entityManager;
因为ds1的entityManger声明了@Primary,所以无需指明unitName,ds2必须指明。注入了准确的entityManager,就可以直接拿来操作数据库了。service层和上面一样的,@Transactional("xxxManager")指明事物管理器即可!
2.采用jdbcTemplate方式,直接注入到Service层对象即可,so easy!
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TransactionTemplate transactionTemplate;
@Resource(name="jdbcTemplate2")
private JdbcTemplate jdbcTemplate2;
@Resource(name="transactionTemplate2")
private TransactionTemplate transactionTemplate2;
好了,spring boot 多数据源,完美解决! 而且三种数据库操作方法均支持,包括事物。已经经过实践证明了! 这是官方给出的最佳实践,只是官方文档没写细。导致整整坑了我几天。至此,spring boot框架的使用就告一段落了!
以上这篇解决spring boot 1.5.4 配置多数据源的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# springboot
# 多数据源
# 关于springboot配置druid数据源不生效问题(踩坑记)
# springboot配置多数据源后mybatis拦截器失效的解决
# springboot 多数据源配置不生效遇到的坑及解决
# 多个
# 就不
# 给大家
# 管理器
# 就可以
# 这是
# 好了
# 几天
# 希望能
# 不受
# 三种
# 可以使用
# 这篇
# 若要
# 落了
# 创建一个
# 小编
# 好后
# 贴了
# 大家多多
相关文章:
如何在阿里云域名上完成建站全流程?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何在宝塔面板中修改默认建站目录?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何快速搭建响应式可视化网站?
网站制作新手教程,新手建设一个网站需要注意些什么?
建站之星如何防范黑客攻击与数据泄露?
学校为何禁止电信移动建设网站?
C#如何使用XPathNavigator高效查询XML
如何通过虚拟主机快速搭建个人网站?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
建站之星如何通过成品分离优化网站效率?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何在七牛云存储上搭建网站并设置自定义域名?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
孙琪峥织梦建站教程如何优化数据库安全?
如何快速生成橙子建站落地页链接?
网站图片在线制作软件,怎么在图片上做链接?
如何用PHP快速搭建高效网站?分步指南
建站之星后台管理:高效配置与模板优化提升用户体验
山东云建站价格为何差异显著?
如何做静态网页,sublimetext3.0制作静态网页?
制作网站外包平台,自动化接单网站有哪些?
,制作一个手机app网站要多少钱?
深圳网站制作的公司有哪些,dido官方网站?
如何用搬瓦工VPS快速搭建个人网站?
如何在阿里云虚拟服务器快速搭建网站?
建站之星安装失败:服务器环境不兼容?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
如何基于云服务器快速搭建个人网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
网页设计网站制作软件,microsoft office哪个可以创建网页?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
c++ stringstream用法详解_c++字符串与数字转换利器
如何在建站主机中优化服务器配置?
c++怎么用jemalloc c++替换默认内存分配器【性能】
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站之星图片链接生成指南:自助建站与智能设计教程
如何用西部建站助手快速创建专业网站?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何挑选最适合建站的高性能VPS主机?
如何通过宝塔面板实现本地网站访问?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
网站制作公司,橙子建站是合法的吗?
网站制作网站,深圳做网站哪家比较好?
网站制作服务平台,有什么网站可以发布本地服务信息?
*请认真填写需求信息,我们会在24小时内与您取得联系。