java之spring boot 1.5.4 配置多数据源
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 @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); } }
相关知识点: 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); } }
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); }
上面两个接口分属两个数据源,在@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; } }
知识扩展 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之spring boot 1.5.4 配置多数据源的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

标题:Linux系统中GDM的工作原理及配置方法在Linux操作系统中,GDM(GNOMEDisplayManager)是一种常见的显示管理器,用于控制图形用户界面(GUI)登录和用户会话管理。本文将介绍GDM的工作原理和配置方法,以及提供具体的代码示例。一、GDM的工作原理GDM是GNOME桌面环境下的显示管理器,负责启动X服务器并提供登录界面,用户输

Spring+AI作为行业领导者,通过其强大、灵活的API和先进的功能,为各种行业提供了领先性的解决方案。在本专题中,我们将深入探讨Spring+AI在各领域的应用示例,每个案例都将展示Spring+AI如何满足特定需求,实现目标,并将这些LESSONSLEARNED扩展到更广泛的应用。希望这个专题能对你有所启发,更深入地理解和利用Spring+AI的无限可能。Spring框架在软件开发领域已经有超过20年的历史,自SpringBoot1.0版本发布以来已有10年。现在,无人会质疑,Spring

了解LinuxBashrc:功能、配置与使用方法在Linux系统中,Bashrc(BourneAgainShellruncommands)是一个非常重要的配置文件,其中包含了系统启动时自动运行的各种命令和设置。Bashrc文件通常位于用户的家目录下,是一个隐藏文件,它的作用是为用户自定义设置Bashshell的环境。一、Bashrc的功能设置环境

MyBatisGenerator是MyBatis官方提供的一个代码生成工具,可以帮助开发人员快速生成符合数据库表结构的JavaBean、Mapper接口以及XML映射文件。在使用MyBatisGenerator进行代码生成的过程中,配置参数的设置是至关重要的。本文将从配置参数的角度出发,深入探讨MyBatisGenerator的

Win11系统如何配置工作组工作组是一种在局域网中连接多台计算机的方式,它允许计算机之间共享文件、打印机和其他资源。在Win11系统中,配置工作组非常简单,只需按照以下步骤操作即可。步骤1:打开“设置”应用程序首先,点击Win11系统的“开始”按钮,然后在弹出的菜单中选择“设置”应用程序。你也可以使用快捷键“Win+I”打开“设置”。步骤2:选择“系统”在“设置”应用程序中,你会看到多个选项。请点击“系统”选项,进入系统设置页面。步骤3:选择“关于”在“系统”设置页面中,你会看到多个子选项。请点

标题:Linux系统中如何配置和安装FTPS,需要具体代码示例在Linux系统中,FTPS是一种安全的文件传输协议,与FTP相比,FTPS通过TLS/SSL协议对传输的数据进行加密,提高了数据传输的安全性。在本文中,将介绍如何在Linux系统中配置和安装FTPS,并提供具体的代码示例。步骤一:安装vsftpd打开终端,输入以下命令安装vsftpd:sudo

JUnit是Spring项目中广泛使用的Java单元测试框架,可以通过以下步骤应用:添加JUnit依赖项:org.junit.jupiterjunit-jupiter5.8.1test编写测试用例:使用@ExtendWith(SpringExtension.class)启用扩展,使用@Autowired注入Bean,使用@BeforeEach和@AfterEach准备和清理,用@Test标记测试方法。

手把手教你配置Maven本地仓库:提升项目构建速度Maven是一个强大的项目管理工具,广泛应用于Java开发中。它能够帮助我们管理项目依赖、构建项目以及发布项目等,但在实际开发过程中,有时会遇到项目构建速度较慢的问题。其中一个解决方法是配置本地仓库,以提升项目构建速度。本文将手把手地教你如何配置Maven本地仓库,让你的项目构建更加高效。为什么需要配置本地仓
