[英]Spring : how to get multiple datasource with 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);
}
}
这是一个简单的 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, 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 个类来管理新数据库:服务接口、@Transactionnal("txSecond") 服务实现、DAO 接口、基于 genericDao 的 DAO 实现,它具有在注入的数据源上创建的 JdbcTemplate 对象。
我创建了一个 Junit 测试,但暂时,我阻止了一个异常: NoSuchBeanDefinitionException :没有定义 javax.sql.DataSource 类型的唯一 bean。 预期单个匹配 bean,但发现 2 个(firstDs、SecondDs)。
我认为 pb 是 genericDao 但不确定。
如何管理?
谢谢你。
在配置文件中的每个 bean 上手动设置 dataSource
<bean id="elementDao" class="ElementDaoImpl" autowire="byName">
<property name="datasource" ref="datasource2">
</bean>
问题是在自动装配数据源时,您没有指定任何限定符。
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
因此,如果您需要同一类中的两个数据源,请使用两个不同的 setter 注入配置它们,并在每种情况下提供适当的限定符。
默认情况下,自动装配的注解按 bean类型映射,因此当配置 xml 中存在多个相同类型的 bean 时,必须使用qualifier("bean id")以便让 spring 容器知道要连接哪个 bean。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.