有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个使用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);
}

}

这是一把简单的刀

@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配置了注释

<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个类来管理新数据库:Interface for service、Implementation for service with@Transactionnal(“txSecond”)、Interface for DAO、基于genericDao的DAO实现,后者在注入的数据源上创建了一个JdbcTemplate对象

我创建了一个Junit测试,但目前我遇到了一个异常:NoSuchBeanDefinitionException:没有javax类型的唯一bean。sql。定义了数据源。需要一个匹配的bean,但找到了2个(firstDs,SecondDs)

我认为pb是通用DAO,但不确定

如何管理

谢谢


共 (0) 个答案