【问题标题】:Configuring multiple data sources in spring-web.xmlspring-web.xml中配置多个数据源
【发布时间】:2018-04-12 04:55:32
【问题描述】:

spring 中的多个数据源

我的spring-web.xml是这样的

<!-- Data source Bean -->
<bean id="dataSource"
     class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver" />
    <property name="url" value="jdbc:as400://localhost/BB" />
    <property name="username" value="ROOT" />
    <property name="password" value="ROOT" />
</bean>

我的DAOImpl是这样的

public class BBDAOImpl extends JdbcDaoSupport implements BBDao {    

@Autowired
DataSource dataSource;

@Override
public List<Map<String, Object>> getDetails(String customerId) {
    String sql = "<SQL Query>";
    if(BBUtil.getInstance().isNotEmpty(customerId)) {
        try {
            return getJdbcTemplate().queryForList(sql,customerId);
        }  catch (EmptyResultDataAccessException e) {
            logger.error("Empty result data - getDetails");
        }
    } else {
        // Want to configure here from second data source
    }

    return null;
}

这里的 getJdbcTemplate() 方法直接指向 AS400 DB(但是如何)。现在,我的另一个要求出现了。在 else 块中,我想从另一个 SQL Server 进行一些数据操作。

谁能告诉我如何在其中配置多个数据库以及如何使用它们?

该项目已经使用 XML 配置开发,现在我无法返回注解配置。

提前谢谢各位。

【问题讨论】:

    标签: java xml spring spring-mvc


    【解决方案1】:

    定义两组 jdbc 模板,如下所示:

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <bean id="jdbcTemplate2" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource2"/>
    </bean>
    

    然后提前将它们注入到存储库中,如下所示:

        @Resource("jdbcTemplate")
        private JdbcTemplate jdbcTemplate;
    
        @Resource("jdbcTemplate2")
        private JdbcTemplate jdbcTemplate2;
    

    在你的 spring 数据配置文件中定义两个数据源,如下所示:

    <!-- Data source Bean 1 -->
     <bean id="dataSource"
     class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
       <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver" />
       <property name="url" value="jdbc:as400://localhost/BB" />
       <property name="username" value="ROOT" />
       <property name="password" value="ROOT" />
    </bean>
    
    <bean id="dataSource2"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
        <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver" />
        <property name="url" value="jdbc:as4002://localhost/BB2" />
        <property name="username" value="ROOT" />
        <property name="password" value="ROOT" />
    </bean>
    

    然后在您的存储库类中注入如下数据源,并在您想要的任何地方使用:

    @Autowired
    DataSource dataSource;
    
    @Autowired
    DataSource dataSource1;
    

    现在为您的 if else 要求使用第二个 JDBC 模板,它将使用数据源 2。

    【讨论】:

    • getJdbcTemplate() 怎么会知道使用哪个数据源?
    • Answer 更新添加 jdbc 模板说明。请看。
    • 它只接受@Resource 但不接受@Resource("jdbcTemplate")。请检查语法
    • 只有资源也可以
    【解决方案2】:

    您可以配置额外的数据源,例如

    <bean id="dataSource1"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
        <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver" />
        <property name="url" value="jdbc:as400://localhost/BB" />
        <property name="username" value="ROOT" />
        <property name="password" value="ROOT" />
    </bean>
    
    <bean id="dataSource2"
         class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
        <property name="driverClassName" value="com.ibm.as400.access.AS400JDBCDriver" />
        <property name="url" value="jdbc:as400://localhost/BB" />
        <property name="username" value="ROOT" />
        <property name="password" value="ROOT" />
    </bean>
    

    然后当你想注入的时候,你可以使用@Qualifier注解。

    @Autowired
    @Qualifier("dataSource1")
    DataSource dataSource1;
    
    @Autowired
    @Qualifier("dataSource2")
    DataSource dataSource2;
    

    现在,当你想在一个类中使用第一个数据源时,你将使用变量dataSource1,当你想使用第二个数据源时,你必须使用变量dataSource2

    但是,现在您必须使用 @Qualifier 注释修改所有数据访问层,因为 Spring 将在 Datasource 中注入两个候选数据源,并且可能会询问您要注入哪一个。

    【讨论】:

    • getJdbcTemplate() 怎么会知道使用哪个数据源?
    • 更新了答案。请检查。
    猜你喜欢
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多