首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring :如何使用GenericDao获取多数据源?

Spring :如何使用GenericDao获取多数据源?
EN

Stack Overflow用户
提问于 2012-11-12 22:09:59
回答 4查看 13.3K关注 0票数 3

我有一个使用Spring 3.1.1的web应用程序。我们有一个使用JdbcTemplate的genericDao。数据源在GenericDaoImpl中的注入方式如下所示。

代码语言:javascript
复制
public class GenericDaoImpl<T extends Serializable> implements GenericDao<T> {

protected Class<T> entityClass;

protected JdbcTemplate jdbcTemplate;

@Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

....

@Override
public List<T> findAll(String sql, ParameterizedRowMapper<T> mapper, Object... args) {
    return jdbcTemplate.query(sql, mapper, args);
}

}

这是一个简单的DAO。

代码语言:javascript
复制
@Repository
public class ElementDaoImpl extends GenericDaoImpl<Element> implements ElementDao {

    private static ParameterizedRowMapper<Element> mapper = new ParameterizedRowMapper<Element>() {...};

    public List<Element> findChildren(int id) {
        sql = "SELECT....";
        return findAll(sql, mapper, new Object[] {id});
    }

}

目前,由于有了独特的数据源,它工作得很完美。applicationContext使用注释进行配置。

代码语言:javascript
复制
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>

现在我必须集成一个新的DAO,仍然使用genericDao,但是在另一个数据库上工作(所以是另一个数据源)。

我在服务中使用@Transactionnal。我在spring文档中读到,我们可以为事务指定一个限定符,以便选择好的事务管理器。

所以,我创建了一个新的数据源,一个新的事务管理器...

代码语言:javascript
复制
<bean id="firstDS" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="secondDS" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="firstDS"/>
</bean>

<bean id="txManagerSecond" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="secondDS"/>
    <qualifier value="txSecond"/>
</bean>

<tx:annotation-driven proxy-target-class="true"/>

在我的新服务上,我已经将值添加到@Transactionnal注释中:

代码语言:javascript
复制
 @Transactionnal("txSecond")

为了继续,我有4个类来管理新的数据库:服务的接口,使用@Transactionnal("txSecond")实现服务,DAO的接口,基于genericDao的DAO实现,它有一个在注入的数据源上创建的JdbcTemplate对象。

我创建了一个Junit测试,但我暂时阻塞了一个异常: NoSuchBeanDefinitionException :没有定义javax.sql.DataSource类型的惟一bean。应为单个匹配bean,但找到了2个(firstDs,SecondDs)。

我认为pb是genericDao,但不确定。

该如何管理呢?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2012-11-12 22:32:34

在配置文件中的每个bean上手动设置dataSource

代码语言:javascript
复制
<bean id="elementDao" class="ElementDaoImpl" autowire="byName">
   <property name="datasource" ref="datasource2">
</bean>

另一种解决方案:使用“别名”http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-java-bean-aliasing

票数 3
EN

Stack Overflow用户

发布于 2012-11-13 23:38:56

问题是,在自动装配数据源时,您没有指定任何限定符。

代码语言:javascript
复制
 @Autowired


public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);

}

因此,如果您需要同一个类中的两个数据源,请使用两个不同的setter注入来配置它们,并在每种情况下提供适当的限定符。

票数 0
EN

Stack Overflow用户

发布于 2013-10-01 04:12:58

默认情况下,自动连接的注解映射到bean的类型,因此必须使用限定符(“bean id"),以便让spring容器知道在config xml中存在相同类型的多个bean时连接哪个bean。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13345206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档