在spring-web.xml

时间:2017-10-31 05:19:05

标签: java xml spring spring-mvc

春天的多个数据源

我的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配置开发,现在我无法返回注释配置。

先谢谢你们。

2 个答案:

答案 0 :(得分:0)

定义两组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;

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

答案 1 :(得分:0)

您可以配置其他数据源,例如

<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,并且很可能会问你哪一个注入。