当前位置: 首页 > 知识库问答 >
问题:

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

诸葛砚文
2023-03-14

我有一个使用Spring3.1的web应用程序。1.我们有一个使用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"/>

现在我必须集成一个新的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类型的唯一bean。sql。定义了数据源。应为单个匹配bean,但找到2个(firstDs、SecondDs)。

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

如何管理?

非常感谢。

共有3个答案

施喜
2023-03-14

默认情况下,自动连线注释按bean的类型进行映射,因此必须使用限定符(“bean id”),以便让spring容器知道在配置xml中存在多个相同类型的bean时要连线哪个bean。

淳于升
2023-03-14

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

 @Autowired


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

}

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

孙夕
2023-03-14

在配置文件中的每个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

 类似资料:
  • 另一个使用另一个bank和tbm的类,我尝试了另一个bank的PersistenceContext。

  • 问题内容: 假设单击了超链接,并使用以下参数列表触发了。现在如何中捕获所有使用的参数? 我的要求是我必须捕获所有参数并将它们放在地图中。 请帮忙! 问题答案: 你可以按上述方式使用RequestParam。

  • 假设单击了一个超链接,并使用以下参数list激发了一个url。现在如何在spring MVC中使用捕获所有参数? 我的要求是我必须捕获所有的参数,并将它们放在一个地图中。

  • 我尝试使用spring batch从一个表中读取数据并写入其他表,但现在我的要求是从多个表中读取数据并写入一个文件,所以我们可以通过定义多个作业来实现这一点,但我想使用单个作业来实现,即单个读取器、单个写入器和单个处理器。 请为我提供一些关于这个场景的参考资料。

  • 我使用Spring引导,Spring数据JPA,我正在寻找解决方案,以获得给定表的所有列名。但没能按我的要求找到 不需要本机查询的解决方案。正在寻找使用spring数据抽象的通用解决方案。 我可以使用普通java获取列名,但我想使用spring数据JPA获取它们。

  • 我正在测试一个基于酒店搜索的场景。所以我做了3个模型类,分别是酒店、房间和可用性 下面是我们正在使用的三个模型类。 Hotel.java @文档(集合="酒店")公共类酒店{ } Room.java @文件(收集=“房间”)公共教室{ } 可利用性Java语言 @文件(收集=“房间”)公共类可用性{ } 这些存储在两个mongodb集合中,一个用于酒店,另一个用于房间和可用性。 下面是我们从中提取