如何在控制器中定义Spring数据源?

时间:2009-10-13 16:03:04

标签: java spring jdbc spring-mvc controller

是否可以在Spring控制器中定义数据源连接器?

我正在开发一个工具:将源表同步到目标表 我将在我的控制器中定义源和目标(以同步不同的数据库 - 在我看来,我可以选择不同的源和目标数据库)。

实际上,我在文件调用中定义了我的数据源:datasource.xml

我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />

    <bean id="sourceDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/source"/>
        <!--<property name="url" value="jdbc:mysql://linkSource"/>-->
        <property name="username" value="username"/>
        <property name="password" value="password"/>
    </bean>

        <bean id="targetDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/target"/>
        <!--<property name="url" value="jdbc:mysql://linkTarget"/>-->
        <property name="username" value="username"/>
        <property name="password" value="password"/>
    </bean>

</beans>

感谢您的帮助!


感谢您的帮助! 但我认为我的问题很严重。

实际上,我的sync-servelt.xml(只是部分):

        <!--sync query beans-->
        <bean id="sourceDatasetQueryBean" class="ds.sync.db.SyncDatasetQuery" name="sourceDatasetsQuery">
            <property name="dataSource" ref="sourceDataSource"/>
        </bean>

        <bean id="targetDatasetQueryBean" class="ds.sync.db.SyncDatasetQuery" name="targetDatasetsQuery">
            <property name="dataSource" ref="targetDataSource"/>
        </bean>

        <bean id="sourceDatasetDescriptionQueryBean" class="ds.sync.db.SyncDatasetDescriptionQuery" name="sourceDatasetsDescriptionQuery">
            <property name="dataSource" ref="sourceDataSource"/>
        </bean>

        <bean id="targetDatasetDescriptionQueryBean" class="ds.sync.db.SyncDatasetDescriptionQuery" name="targetDatasetsDescriptionQuery">
            <property name="dataSource" ref="targetDataSource"/>
        </bean>
...more...

而且,在我的控制器中我正在使用:

 @Autowired
 @Qualifier("sourceDatasetQueryBean")
 protected SyncDatasetQuery m_datasetQuerySource;

 @Autowired
 @Qualifier("targetDatasetQueryBean")
 protected SyncDatasetQuery m_datasetQueryTarget;

 @Autowired
 @Qualifier("sourceDatasetDescriptionQueryBean")
 protected SyncDatasetDescriptionQuery m_datasetDescriptionQuerySource;

 @Autowired
 @Qualifier("targetDatasetDescriptionQueryBean")
 protected SyncDatasetDescriptionQuery m_datasetDescriptionQueryTarget;
...more...

我有11个表在源和目标之间同步...
有没有办法对我的查询bean进行分组?

我的同步必须在多个数据库上执行 例如,我在不同的地方有3个站点,1个站点是SOURCE(A),2个站点是TARGET(B&amp; C);使用表格(由YUI制作),我应该能够同步A-&gt; B和A-&gt; C. 总结一下:
1-我的表单我选择了一个SOURCE和一个TARGET(几个数据库),
2-我的表单发送(在Ajax中),选择的SOURCE和选择的TARGET到我的控制器,
3-我的控制器指向良好的数据库。

最好的方法是什么?
使用工厂? 使用setDataSource?
谢谢你的帮助。

4 个答案:

答案 0 :(得分:0)

您应该能够使用以下语法来实现您的目标(请参阅Spring 2.x docs):

@Autowired
@Qualifier("targetDataSource")
DataSource targetDataSource;

@Autowired
@Qualifier("sourceDataSource")
DataSource sourceDataSource;

答案 1 :(得分:0)

因此,假设您的数据源定义正确,只需将它们注入您的Controller:

<bean id="myController" class="...">
   <property name="sourceDS" ref="sourceDataSource" />
   <property name="targetDS" ref="targetDataSource" />
   ....
</bean>

答案 2 :(得分:0)

如果您不想弄乱spring xml文件,并在属性或任何其他GUI中继中以在运行时定义这些数据源,您可以使用:

applicationContext.getBean(bean,object[]) 

请注意,弹簧不是一个好习惯(即使它有时非常方便)。 这样,您可以定义期望构造函数参数的bean,并将这些参数作为数组的一部分提供。这样,您可以在运行时创建所需的数据源,从而将这些数据源从您希望存储信息的位置获取。

答案 3 :(得分:0)

最后,通过使用DriverManagerDataSource并使用setter,我可以在我的控制器中动态重新定义我选择的dataSource(目标和源)。

我只需要使用: setDriverManagerDataSource(m_sourceDataSource); 和m_datasetQuerySource.setDataSource(dataSource); (SOURCE)

与目标和所有表格相同。

我还看到其他方法: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://grails.org/Spring+Bean+Builder