spring怎么配置多个数据源

worktile 其他 26

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    在Spring框架中,配置多个数据源可以通过以下几个步骤实现:

    1、定义数据源Bean:在Spring的配置文件中,首先需要定义多个数据源Bean。可以根据实际需求选择合适的数据源。

    例如,下面是两个数据源的示例:

    <bean id="dataSource1" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- dataSource1 的配置项 -->
    </bean>
    
    <bean id="dataSource2" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- dataSource2 的配置项 -->
    </bean>
    

    2、配置数据源交由Spring管理:通过配置文件,将定义的数据源Bean交由Spring框架进行管理。

    <!-- 配置数据源1 -->
    <bean id="dataSource1" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="dataSource1Target" />
    </bean>
    
    <bean id="dataSource1Target" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- dataSource1 的配置项 -->
    </bean>
    
    <!-- 配置数据源2 -->
    <bean id="dataSource2" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
        <property name="targetDataSource" ref="dataSource2Target" />
    </bean>
    
    <bean id="dataSource2Target" class="org.apache.commons.dbcp2.BasicDataSource">
        <!-- dataSource2 的配置项 -->
    </bean>
    
    <!-- 配置多数据源的路由 -->
    <bean id="dynamicDataSource" class="com.example.DynamicDataSource">
        <property name="targetDataSources">
            <map>
                <entry key="dataSource1" value-ref="dataSource1" />
                <entry key="dataSource2" value-ref="dataSource2" />
            </map>
        </property>
        <property name="defaultTargetDataSource" ref="dataSource1" />
    </bean>
    

    3、配置DAO和事务:根据需要,配置使用哪个数据源进行访问数据库。

    可以通过在DAO中使用@Qualifier注解指定使用的数据源,例如:

    @Repository
    @Qualifier("dataSource1")
    public class UserDAO1 implements UserDAO {
        // DAO的具体实现
    }
    
    @Repository
    @Qualifier("dataSource2")
    public class UserDAO2 implements UserDAO {
        // DAO的具体实现
    }
    

    或者在service层的方法上使用@Transactional注解指定使用的数据源,例如:

    @Service
    public class UserService {
        @Autowired
        @Qualifier("dataSource1")
        private UserDAO userDAO1;
    
        @Autowired
        @Qualifier("dataSource2")
        private UserDAO userDAO2;
    
        @Transactional("dataSource1")
        public void addUser1(User user) {
            userDAO1.add(user);
        }
    
        @Transactional("dataSource2")
        public void addUser2(User user) {
            userDAO2.add(user);
        }
    }
    

    通过以上步骤的配置,就可以实现在Spring框架中配置多个数据源,并根据需要使用不同的数据源进行数据库访问。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    在Spring中,配置多个数据源可以使用以下几种方法:

    1. 使用注解配置多个数据源:可以使用@Configuration@Bean注解来创建数据源对象,并通过@Primary注解设置默认数据源。然后使用@Qualifier注解为需要使用的数据源指定不同的名称。在使用时,通过@Autowired@Qualifier注解将数据源注入到需要使用的地方。

    例如:

    @Configuration
    public class DataSourceConfig {
    
        @Primary
        @Bean(name = "dataSource1")
        public DataSource dataSource1() {
            // 创建第一个数据源
            return new DataSource1();
        }
    
        @Bean(name = "dataSource2")
        public DataSource dataSource2() {
            // 创建第二个数据源
            return new DataSource2();
        }
    
    }
    
    @Service
    public class MyService {
    
        @Autowired
        @Qualifier("dataSource1")
        private DataSource dataSource1;
    
        @Autowired
        @Qualifier("dataSource2")
        private DataSource dataSource2;
    
        // 使用dataSource1和dataSource2进行数据库操作
    }
    
    1. 使用XML配置多个数据源:首先在Spring配置文件中定义多个DataSource对象,并使用id属性为每个数据源指定一个唯一的名称。然后在需要使用数据源的地方,使用ref属性引用对应的数据源。

    例如:

    <beans>
        <bean id="dataSource1" class="com.example.DataSource1" />
        <bean id="dataSource2" class="com.example.DataSource2" />
    
        <bean id="myService" class="com.example.MyService">
            <property name="dataSource1" ref="dataSource1" />
            <property name="dataSource2" ref="dataSource2" />
        </bean>
    </beans>
    
    1. 使用Spring Boot自动配置多个数据源:在Spring Boot中,可以通过配置application.propertiesapplication.yml文件来定义多个数据源。需要在配置文件中以spring.datasource开头来配置每个数据源的相关属性。

    例如:

    spring:
      datasource:
        # 第一个数据源的配置
        datasource1:
          driver-class-name: com.example.DataSource1
          url: jdbc:mysql://localhost:3306/db1
          username: user1
          password: pass1
        # 第二个数据源的配置
        datasource2:
          driver-class-name: com.example.DataSource2
          url: jdbc:mysql://localhost:3306/db2
          username: user2
          password: pass2
    

    然后在需要使用数据源的地方,可以使用@Autowired注解来将数据源注入。

    以上是配置多个数据源的几种常见方法,具体选择哪种方法取决于项目的具体需求和配置方式的偏好。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    在Spring中配置多个数据源可以使用以下两种方法:使用Spring Boot和使用传统的Spring配置方法。

    方法一:使用Spring Boot配置多个数据源

    1. 引入依赖
      在pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
    </dependency>
    
    1. 配置数据源
      在application.properties(或application.yaml)文件中配置数据源信息,例如:
    # 第一个数据源
    spring.datasource.url=jdbc:mysql://localhost:3306/db1
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    # 第二个数据源
    spring.datasource.secondary.url=jdbc:mysql://localhost:3306/db2
    spring.datasource.secondary.username=root
    spring.datasource.secondary.password=123456
    spring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver
    
    1. 配置数据源Bean
      创建两个数据源类,分别对应两个数据源:
    @Configuration
    public class PrimaryDataSourceConfig {
        @Bean
        @Primary
        @ConfigurationProperties(prefix="spring.datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    @Configuration
    public class SecondaryDataSourceConfig {
        @Bean
        @ConfigurationProperties(prefix="spring.datasource.secondary")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    1. 配置JPA
      为每个数据源配置一个JPA实体管理工厂和一个事务管理器。这可以在对应的数据源配置类中完成。
    @Configuration
    @EnableJpaRepositories(
        basePackages = "com.example.repository1",
        entityManagerFactoryRef = "primaryEntityManagerFactory",
        transactionManagerRef = "primaryTransactionManager"
    )
    public class PrimaryDataSourceConfig {
        // ...
    
        @Bean
        @Primary
        public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) {
            return builder
                .dataSource(dataSource)
                .packages("com.example.model1")
                .persistenceUnit("primaryUnit")
                .build();
        }
    
        @Bean
        @Primary
        public PlatformTransactionManager primaryTransactionManager(
            @Qualifier("primaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    }
    
    @Configuration
    @EnableJpaRepositories(
        basePackages = "com.example.repository2",
        entityManagerFactoryRef = "secondaryEntityManagerFactory",
        transactionManagerRef = "secondaryTransactionManager"
    )
    public class SecondaryDataSourceConfig {
        // ...
    
        @Bean
        public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) {
            return builder
                .dataSource(dataSource)
                .packages("com.example.model2")
                .persistenceUnit("secondaryUnit")
                .build();
        }
    
        @Bean
        public PlatformTransactionManager secondaryTransactionManager(
            @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    }
    
    1. 使用数据源
      使用@Autowired注解将数据源注入到需要使用的类中。
    @Service
    public class UserService {
        @Autowired
        private UserRepository1 userRepository1;
    
        @Autowired
        private UserRepository2 userRepository2;
    
        public void saveUser(User user) {
            userRepository1.save(user);
            userRepository2.save(user);
        }
    }
    

    方法二:使用传统的Spring配置方法

    1. 配置数据源Bean
      与方法一类似,创建两个数据源Bean,分别对应两个数据源。
    @Configuration
    public class PrimaryDataSourceConfig {
        @Bean
        @Primary
        @ConfigurationProperties(prefix="primary.datasource")
        public DataSource primaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    @Configuration
    public class SecondaryDataSourceConfig {
        @Bean
        @ConfigurationProperties(prefix="secondary.datasource")
        public DataSource secondaryDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    
    1. 配置JdbcTemplate
      为每个数据源配置一个JdbcTemplate。
    @Configuration
    public class PrimaryJdbcTemplateConfig {
        @Bean
        @Primary
        public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    
    @Configuration
    public class SecondaryJdbcTemplateConfig {
        @Bean
        public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    
    1. 使用数据源
      使用@Autowired注解将JdbcTemplate注入到需要使用的类中。
    @Service
    public class UserService {
        @Autowired
        @Qualifier("primaryJdbcTemplate")
        private JdbcTemplate primaryJdbcTemplate;
    
        @Autowired
        @Qualifier("secondaryJdbcTemplate")
        private JdbcTemplate secondaryJdbcTemplate;
    
        public void saveUser(User user) {
            String sql = "INSERT INTO user (id, name) VALUES (?, ?)";
            primaryJdbcTemplate.update(sql, user.getId(), user.getName());
            secondaryJdbcTemplate.update(sql, user.getId(), user.getName());
        }
    }
    

    这样就完成了在Spring中配置多个数据源。可以根据具体需要增加或调整配置项。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部