加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java-Spring:如何使用GenericDao获取多个数据源?

发布时间:2020-12-15 01:22:11 所属栏目:大数据 来源:网络整理
导读:我有一个使用Spring 3.1.1的Web应用程序. 我们有一个使用JdbcTemplate的genericDao.数据源正在GenericDaoImpl中注入. public class GenericDaoImplT extends Serializable implements GenericDaoT {protected ClassT entityClass;protected JdbcTemplate jdb

我有一个使用Spring 3.1.1的Web应用程序.
我们有一个使用JdbcTemplate的genericDao.数据源正在GenericDaoImpl中注入.

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.

@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,new Object[] {id});
    }

}

暂时,借助独特的数据源,它可以完美运行.
applicationContext配置有注释.

<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"/>

现在,我必须仍然使用genericDao来集成一个新的DAO,但是要在另一个数据库上工作(因此是另一个数据源).

我在服务中使用@Transactionnal.我阅读了Spring文档,我们可以为交易指定条件,以便选择优秀的交易管理器.

因此,我创建了一个新的数据源,一个新的事务管理器…

<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批注中:

 @Transactionnal("txSecond")

要恢复,我有4个类来管理新数据库:服务接口,@Transactionnal(“ txSecond”)服务实现,DAO接口,基于genericDao的DAO实现,在注入的数据源上创建了JdbcTemplate对象.

我创建了一个Junit测试,但是暂时,我阻止了一个异常:NoSuchBeanDefinitionException:没有定义类型javax.sql.DataSource的唯一bean.预期单个匹配的Bean,但找到了2个(firstD,SecondD).

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

如何处理?

谢谢.

最佳答案
在配置文件中的每个bean上手动设置dataSource

<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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读