如何在spring中配置多个数据源

时间:2015-03-18 06:00:38

标签: spring

在我的应用程序中,我正在尝试配置两个数据库。配置完成后,我的应用程序部署并成功运行第一个数据库,但是当我试图访问第二个数据库时,我得到“”这个例外。任何人都可以帮助我...提前致谢。

我的Configuration.xml文件

 <bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.properties"></property>

<bean id="dataSource" class="com.iii.orn11j.common.dao.OrionDataSource" 
    destroy-method="close" >

     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="${database.url}"></property>
    <property name="username" value="${database.username}"></property> 
    <property name="password" value="${database.password}"></property> 

    <property name="removeAbandoned" value="true" />
    <property name="removeAbandonedTimeout" value="60" />
    <property name="logAbandoned" value="false" />

    <property name="initialSize" value="2" />
    <property name="maxWait" value="30000" />
    <property name="maxActive" value="30" />
    <property name="minIdle" value="5" />
    <property name="maxIdle" value="15" />

    <!-- <property name="validationQuery" value="select 1 from dual" />
    <property name="testOnBorrow" value="true" />
    <property name="testWhileIdle" value="true" /> -->
</bean>

<bean id="dataSource2" class="com.iii.orn11j.common.dao.OrionDataSource" 
    destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="${database.url2}"></property>
    <property name="username" value="${database.username2}"></property> 
    <property name="password" value="${database.password2}"></property> 

    <property name="removeAbandoned" value="true" />
    <property name="removeAbandonedTimeout" value="60" />
    <property name="logAbandoned" value="false" />

    <property name="initialSize" value="2" />
    <property name="maxWait" value="30000" />
    <property name="maxActive" value="30" />
    <property name="minIdle" value="5" />
    <property name="maxIdle" value="15" />
</bean>

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

我的查询方法是:

@Autowired
OrionDataSource dataSource2;
@Override
public void testCon()throws Exception{
    JdbcTemplate temp=new JdbcTemplate(dataSource2);
    String qry="SELECT COUNT(*) FROM OM_ITEM";
    Integer count=(Integer)temp.queryForObject(qry, Integer.class);
    System.out.println("Connected 2nd DB -----> "+count);
}

2 个答案:

答案 0 :(得分:1)

首先,您需要使用两个dataSource实现jdbcTemplate并使用这两个jdbcTemplate。如果您想直接自动装配数据源,则必须使用autowirequalifier的组合,或者只使用一个名为resource的注释:

@Resource(name = "dataSource")
  private OrionDataSource dataSource;

@Resource(name = "dataSource2")
  private OrionDataSource dataSource2;

如果您尝试使用两个数据源,则需要注入两个不同的jdbcTemplate。

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

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

如果你的查询类可以注入jdbcTemplate。

@Resource(name = "jdbcTemplate1")
      private JdbcTemplate jdbcTemplate1;

@Resource(name = "jdbcTemplate2")
      private JdbcTemplate jdbcTemplate2;

public void testCon()throws Exception{
    String qry="SELECT COUNT(*) FROM OM_ITEM";
    Integer count=(Integer)jdbcTemplate1.queryForObject(qry, Integer.class);
    System.out.println("Connected 2nd DB -----> "+count);
}

答案 1 :(得分:0)

您需要使用@Qualifier@Autowired来注入特定的bean:

@Autowired
@Qualifier("dataSource")
OrionDataSource dataSource;

@Autowired
@Qualifier("dataSource2")
OrionDataSource dataSource2;