用Java基于Spring框架搭建一套支持多数据源的web系统框架

这篇具有很好参考价值的文章主要介绍了用Java基于Spring框架搭建一套支持多数据源的web系统框架。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用Java Spring框架搭建支持多数据源的Web系统框架时,你可以按照以下步骤进行:

步骤一:添加依赖

首先,在pom.xml文件中添加Spring Boot和相关数据库依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- 数据库驱动依赖,例如MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

步骤二:配置多数据源

  1. 创建多个数据源配置类,每个数据源对应一个数据库连接:
  2. @Configuration
    @EnableTransactionManagement
    public class DataSourceConfig {
    
        @Bean(name = "dataSource1")
        @ConfigurationProperties(prefix = "spring.datasource.datasource1")
        public DataSource dataSource1() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "entityManagerFactory1")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory1(
                EntityManagerFactoryBuilder builder,
                @Qualifier("dataSource1") DataSource dataSource) {
            return builder
                    .dataSource(dataSource)
                    .packages("com.example.domain.datasource1")
                    .persistenceUnit("datasource1")
                    .build();
        }
    
        @Bean(name = "transactionManager1")
        public PlatformTransactionManager transactionManager1(
                @Qualifier("entityManagerFactory1") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    }
    
  3. 配置 application.properties 文件,设置多数据源的连接信息:
    ## 数据源1配置
    spring.datasource.datasource1.url=jdbc:mysql://localhost:3306/db1
    spring.datasource.datasource1.username=root
    spring.datasource.datasource1.password=rootPassword
    spring.datasource.datasource1.driver-class-name=com.mysql.cj.jdbc.Driver
    
    ## 数据源2配置
    spring.datasource.datasource2.url=jdbc:mysql://localhost:3306/db2
    spring.datasource.datasource2.username=root
    spring.datasource.datasource2.password=rootPassword
    spring.datasource.datasource2.driver-class-name=com.mysql.cj.jdbc.Driver
    

    步骤三:定义实体类和Repository

  4. 创建实体类和对应的Repository接口,分别对应不同的数据源。
  5. 步骤四:创建Controller

    编写Controller类,处理业务逻辑,并根据需要调用不同数据源的Repository。

    @Configuration
    public class DataSourceConfig {
    
        @Primary
        @Bean(name = "dataSource1")
        @ConfigurationProperties(prefix = "spring.datasource.datasource1")
        public DataSource dataSource1() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "entityManagerFactory1")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory1(EntityManagerFactoryBuilder builder,
                                                                           @Qualifier("dataSource1") DataSource dataSource) {
            return builder
                    .dataSource(dataSource)
                    .packages("com.example.entity1")
                    .persistenceUnit("dataSource1")
                    .build();
        }
    
        @Bean(name = "transactionManager1")
        public PlatformTransactionManager transactionManager1(@Qualifier("entityManagerFactory1") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    
        @Bean(name = "dataSource2")
        @ConfigurationProperties(prefix = "spring.datasource.datasource2")
        public DataSource dataSource2() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean(name = "entityManagerFactory2")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory2(EntityManagerFactoryBuilder builder,
                                                                           @Qualifier("dataSource2") DataSource dataSource) {
            return builder
                    .dataSource(dataSource)
                    .packages("com.example.entity2")
                    .persistenceUnit("dataSource2")
                    .build();
        }
    
        @Bean(name = "transactionManager2")
        public PlatformTransactionManager transactionManager2(@Qualifier("entityManagerFactory2") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    }
    

    在这段代码中,我们配置了两个数据源(dataSource1dataSource2),每个数据源都有对应的实体管理工厂(entityManagerFactory1entityManagerFactory2)以及事务管理器(transactionManager1transactionManager2)。

    步骤五:使用多数据源

    在服务或业务逻辑中,根据需要使用不同的数据源。可以通过在Repository中指定数据源的方式来实现:

    @Repository
    public interface UserRepository extends JpaRepository<User, Long> {
        // 使用第一个数据源
    }
    
    @Repository
    public interface ProductRepository extends JpaRepository<Product, Long> {
        // 使用第二个数据源
    }
    

    步骤六:配置多数据源交换

    在需要切换数据源的地方,可以使用@Primary@Qualifier注解来指定使用哪个数据源。比如在Service层或Controller层中:

    @Service
    public class UserService {
        
        @Autowired
        @Qualifier("userRepository")
        private UserRepository userRepository;
    
        // 使用第一个数据源的Repository操作数据
    }
    
    @Service
    public class ProductService {
    
        @Autowired
        @Qualifier("productRepository")
        private ProductRepository productRepository;
    
        // 使用第二个数据源的Repository操作数据
    }
    

    步骤七:测试多数据源功能

    最后,通过编写测试用例来验证多数据源的功能是否正常工作。可以分别测试不同数据源的读写操作,以确保整个系统的多数据源支持已经成功搭建。在这段代码中,我们使用了@EnableJpaRepositories注解分别为两个数据源配置了不同的JpaRepository包路径、实体管理工厂引用和事务管理器引用。这样就可以确保每个数据源的JpaRepository都能正确地与对应的实体管理工厂和事务管理器关联起来。

    @EnableJpaRepositories(
            basePackages = "com.example.repository1",
            entityManagerFactoryRef = "entityManagerFactory1",
            transactionManagerRef = "transactionManager1"
    )
    public class DataSource1JpaConfig {
        // 这里配置针对dataSource1的JpaRepository
    }
    
    @EnableJpaRepositories(
            basePackages = "com.example.repository2",
            entityManagerFactoryRef = "entityManagerFactory2",
            transactionManagerRef = "transactionManager2"
    )
    public class DataSource2JpaConfig {
        // 这里配置针对dataSource2的JpaRepository
    }
    

    当需要在多数据源环境下执行事务管理时,需要进行额外的配置以确保事务能够正确地跨多个数据源进行管理。

    步骤八:配置多数据源事务管理

  6. 创建一个事务管理器工厂类,用于创建支持多数据源的事务管理器:
    @Configuration
    public class TransactionManagerConfig {
    
        @Bean
        @Primary
        public PlatformTransactionManager transactionManager(
                @Qualifier("dataSource1TransactionManager") PlatformTransactionManager dataSource1TransactionManager,
                @Qualifier("dataSource2TransactionManager") PlatformTransactionManager dataSource2TransactionManager) {
            ChainedTransactionManager transactionManager = new ChainedTransactionManager(
                    dataSource1TransactionManager, dataSource2TransactionManager);
            return transactionManager;
        }
    }
    
  7. 在需要进行事务管理的Service方法上添加 @Transactional 注解,以确保事务能够正确地跨多个数据源进行管理。
    @Service
    public class MultiDataSourceService {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private ProductRepository productRepository;
    
        @Transactional(transactionManager = "transactionManager")
        public void transferBetweenDataSources(User user, Product product) {
            // 在此方法中进行跨数据源的业务操作
            userRepository.save(user);
            productRepository.save(product);
        }
    }
    

    步骤九:测试多数据源事务管理

    编写测试用例来验证多数据源事务管理的功能是否正常工作。可以模拟跨数据源的业务操作,并验证事务是否能够正确地回滚或提交。

    @Service
    public class MultiDataSourceService {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private ProductRepository productRepository;
    
        @Transactional(transactionManager = "transactionManager")
        public void transferBetweenDataSources(User user, Product product) {
            // 在第一个数据源保存用户信息
            userRepository.save(user);
    
            // 模拟异常情况,使第二个数据源保存产品信息时出现错误
            if (product.getName().equals("error")) {
                throw new RuntimeException("Error occurred while saving product");
            }
    
            // 在第二个数据源保存产品信息
            productRepository.save(product);
        }
    }
    

    在这段代码中,我们定义了一个MultiDataSourceService服务类,其中的transferBetweenDataSources方法模拟了一个跨数据源的业务操作:先在第一个数据源保存用户信息,然后在第二个数据源保存产品信息。如果产品名称为"error",则会抛出运行时异常。

    通过在该方法上添加@Transactional(transactionManager = "transactionManager")注解,确保了事务能够正确地跨多个数据源进行管理。当出现异常时,事务会回滚,保证数据的一致性。文章来源地址https://www.toymoban.com/news/detail-840289.html

到了这里,关于用Java基于Spring框架搭建一套支持多数据源的web系统框架的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot下基于spring data jpa配置mysql+达梦多数据源(以不同包路径方式,mysql为主数据源)

    :mysql 达梦/dameng jpa 多数据源 spring boot:2.1.17.RELEASE mysql驱动:8.0.21(跟随boot版本) 达梦驱动:8.1.2.192 lombok:1.18.12(跟随boot版本) 以mysql为主数据源,达梦为第二数据源方式配置 适用于旧项目二次开发接入达梦数据库或基于通用二方/三方包做业务扩展等场景 将以不

    2024年02月05日
    浏览(64)
  • 数据源作用以及spring配置数据源

    数据源,简单理解为数据源头,提供了应用程序所需要数据的位置。数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等。其中数据源定义了位置信息,用户验证信息和交互时所需的一些特性的配置,同时它封装了如何建立与数据源的连

    2024年02月07日
    浏览(55)
  • springboot多数据源支持自定义连接池

    springboot 多数据源网上的文章很多,但大多都是互相抄袭,虽然可以实现多数据源的效果,但都是使用的默认的连接池,如果盲目使用可能会导致自定义的连接池参数没生效从而引发数据库连接问题。下面是参考官方文档多数据源支持自定义连接池的配置。 https://docs.spring.i

    2024年01月20日
    浏览(48)
  • 【Spring Boot 3】【数据源】自定义多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年02月01日
    浏览(63)
  • 【Spring Boot 3】【数据源】自定义JPA数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月21日
    浏览(72)
  • 【Spring Boot 3】【数据源】自定义JPA多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月22日
    浏览(84)
  • 【Spring Boot 3】【数据源】自定义JDBC多数据源

    软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或少的时间、检索不止一篇资料才能得出一个可工作的DEMO,这占用了我大量的时

    2024年01月23日
    浏览(51)
  • Spring配置数据源

    数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源有: DBCP、C3P0、BoneCP、Druid idea中创建一个maven项目,导入如下所需的基本坐标(mysql、Junit、spring-contex) 两种数

    2023年04月15日
    浏览(37)
  • spring 数据源配置

    写在最前面 前端时间在处理公司老项目改造使用新框架的事情,对于spring数据源配置这块有些疑惑,就翻了一下资料,了解了下spring 数据源配置相关的知识,这里记录一下。 默认数据源 spring boot 默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAut

    2024年02月09日
    浏览(34)
  • SpringBoot整合多数据源,并支持动态新增与切换(详细教程)

    推荐文章:     1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表;     2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据;     3、java后端接口API性能优化技巧     4、SpringBoot+MyBatis流式查询,处理大规模数据,提高系统的性能和响应能力。 一

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包