0

0

java之spring boot 1.5.4 配置多数据源

怪我咯

怪我咯

发布时间:2017-06-26 11:42:24

|

2085人浏览过

|

来源于php中文网

原创

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

 

立即学习Java免费学习笔记(深入)”;

Mall4j商城系统
Mall4j商城系统

Mall4j是一个基于spring boot、spring oauth2.0、mybatis、redis的轻量级、前后端分离、防范xss攻击、拥有分布式锁、为生产环境多实例完全准备、数据库为b2b2c设计、拥有完整sku和下单流程的java开源商城。

下载

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
    @Primarypublic LocalContainerEntityManagerFactoryBean firstEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {return builder
                .dataSource(firstDataSource())
                .packages("com.hdwang.entity.dbFirst")
                .persistenceUnit("firstDs")
                .build();
    }/** * 事务管理对象
     * @return */@Bean(name = "firstTransactionManager")
    @Primarypublic PlatformTransactionManager transactionManager(EntityManagerFactory emf){
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(emf);return transactionManager;
    }

    @Bean
    @Primarypublic JdbcTemplate jdbcTemplate(){return new JdbcTemplate(firstDataSource());
    }

    @Bean
    @Primarypublic TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){return new TransactionTemplate(platformTransactionManager);
    }
}

 

立即学习Java免费学习笔记(深入)”;

相关知识点:
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 */@Beanpublic 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);
    }
}

 

立即学习Java免费学习笔记(深入)”;

 

立即学习Java免费学习笔记(深入)”;

3.Repository数据持久层

package com.hdwang.dao.datajpa.firstDs;

@Repositorypublic 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;

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

 

立即学习Java免费学习笔记(深入)”;

上面两个接口分属两个数据源,在@EnableJpaRepositories配置好后,这里就可以正确操作相应的数据源了


4.Service服务层,注意事物(接口我就不贴了)
@Service@Transactional("firstTransactionManager")public class UserServiceImpl implements UserService {

    @Autowiredprivate UserRepository userRepository;

    @Overridepublic User findById(int id) {return this.userRepository.findOne(id);
    }

    @Overridepublic User findByNumber(String number) {return this.userRepository.findByNumber(number);
    }

    @Overridepublic List<User> findAllUserByPage(int page,int size) {
        Pageable pageable = new PageRequest(page, size);
        Page<User> users =  this.userRepository.findAll(pageable);return users.getContent();
    }

    @Overridepublic User updateUser(User user,boolean throwEx) {
        User userNew = this.userRepository.save(user);if(throwEx){throw new RuntimeException("throw a ex");
        }return userNew;
    }

    @Overridepublic void deleteUser(int id) {this.userRepository.deleteUser(id);
    }
}
@Service@Transactional("secondTransactionManager")public class OrderServiceImpl implements OrderService {

    @Autowiredprivate OrderRepository orderRepository;


    @Overridepublic Order findById(int id) {return this.orderRepository.findOne(id);
    }

    @Overridepublic Order updateOrder(Order order, boolean throwEx) {
        Order orderNew = this.orderRepository.save(order);if(throwEx){throw new RuntimeException("throw a ex");
        }return orderNew;
    }
}

 

立即学习Java免费学习笔记(深入)”;

知识扩展

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框架的使用就告一段落了!
<br/>
<br/><br/>
<br/><br/>

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Spring中文手册
Spring中文手册

共0课时 | 0.6万人学习

马士兵spring视频教程
马士兵spring视频教程

共25课时 | 9.2万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 9.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号