Как определить источник данных Spring в контроллере? - PullRequest
0 голосов
/ 13 октября 2009

Можно ли определить соединитель источника данных в контроллере 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 таблиц для синхронизации между источником и целью ...
Есть ли способ сгруппировать мои компоненты запроса?

Мои синхронизации должны выполняться в нескольких базах данных.
Например, у меня есть 3 сайта в разных местах, 1 сайт - ИСТОЧНИК (A), 2 сайта - TARGET (B & C); с формой (сделанной с помощью YUI) я смогу синхронизировать A-> B и A-> C.
Подведем итог:
1 - в своей форме я выбираю ИСТОЧНИК и ЦЕЛЬ (несколько баз данных),
2- моя форма отправляет (в Ajax) выбранный ИСТОЧНИК и выбранный ЦЕЛЬ на мой контроллер,
3 - мой контроллер указывает на хорошую базу данных.

Каков наилучший способ сделать это?
Используя Фабрику? Использование setDataSource?
Спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 20 октября 2009

Наконец, используя DriverManagerDataSource и setter, я могу динамически переопределять свой выбранный источник данных (цель и источник) динамически в моем контроллере.

Мне просто нужно использовать: setDriverManagerDataSource (m_sourceDataSource); и m_datasetQuerySource.setDataSource (dataSource); (SOURCE)

Та же игра с целью и всеми столами.

Я вижу и другой способ сделать это: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://grails.org/Spring+Bean+Builder

0 голосов
/ 13 октября 2009

Итак, если ваши источники данных определены правильно, это всего лишь вопрос их внедрения в ваш контроллер:

<bean id="myController" class="...">
   <property name="sourceDS" ref="sourceDataSource" />
   <property name="targetDS" ref="targetDataSource" />
   ....
</bean>
0 голосов
/ 15 октября 2009

Если вы не хотите возиться с весенними XML-файлами и передавать свойства или любой другой графический интерфейс для определения этих источников данных во время выполнения, вы можете использовать:

applicationContext.getBean(bean,object[]) 

Имейте в виду, что это не очень хорошая практика с весной (даже то, что иногда это очень удобно). Таким образом, вы определяете свои bean-компоненты, ожидающие аргументы конструктора, и предоставляете эти аргументы как часть массива. Таким образом, вы создаете столько источников данных, сколько вам нужно во время выполнения, и получаете их оттуда, где вы хотите хранить информацию.

0 голосов
/ 13 октября 2009

Вы можете использовать следующий синтаксис для достижения желаемого (см. Spring 2.x документы ):

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

@Autowired
@Qualifier("sourceDataSource")
DataSource sourceDataSource;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...