Вопрос по spring – Как сконфигурировать несколько менеджеров транзакций с помощью Spring + DBUnit + JUnit

5

In a nutshell

Error: User Rate Limit Exceeded

My Code

Error: User Rate Limit Exceeded

<tx:annotation-driven />

<!-- note the default transactionManager name on this one -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"     ref="dataSourceA" />
</bean>

<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource"     ref="dataSourceB" />
</bean>

Error: User Rate Limit Exceeded

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
                                "classpath:resources/spring-db.xml"})  
@Transactional
@TransactionConfiguration(transactionManager = "transactionManagerTarget", defaultRollback = true) 
public class MyIntegrationTest {

    @Autowired
    private MyService service;

    @Autowired
    @Qualifier("dataSourceA")
    private DataSource dataSourceA;

    private IDataSet loadedDataSet;

    /**
     * Required by DbUnit
     */
    @Before
    public void setUp() throws Exception {
        SybaseInsertIdentityOperation.TRUNCATE_TABLE.execute(getConnection(), getDataSet());
        SybaseInsertIdentityOperation.INSERT.execute(getConnection(), getDataSet());
    }

    /**
     * Required by DbUnit
     */
    protected IDataSet getDataSet() throws Exception {
        loadedDataSet = DbUnitHelper.getDataSetFromFile(getConnection(), "TestData.xml");
        return loadedDataSet;
    }

    /**
     * Required by DbUnit
     */
    protected IDatabaseConnection getConnection() throws Exception{
        return new DatabaseConnection(dataSourceA.getConnection());
    }   

    @Test
    public void testSomething() {

        // service.doCopyStuff();

    }

}

Error: User Rate Limit Exceeded@TransactionConfigurationError: User Rate Limit ExceededdataSourceAError: User Rate Limit ExceededtransactionManagerError: User Rate Limit Exceeded

Question

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Note: The application does not require a transaction manager on dataSourceA when running in production as it will only be read-only. This issue is for my tests classes only.

Ваш Ответ

3   ответа
1

Error: User Rate Limit Exceeded<qualifier>Error: User Rate Limit Exceeded

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceA" />
    <qualifier value="transactionManager" />
</bean>

<bean id="transactionManagerTarget" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceB" />
    <qualifier value="transactionManagerTarget" />
</bean>

Error: User Rate Limit Exceeded@TransactionalError: User Rate Limit Exceeded

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:resources/spring-context.xml",
                                "classpath:resources/spring-db.xml"})  
@Transactional("transactionManagerTarget")
@TransactionConfiguration(defaultRollback = true) 
public class MyIntegrationTest {
...
Я пробовал различные варианты использования@Transactional на моем тестовом классе, но, к сожалению, как я подозревал@Test метод запускает транзакцию и@Before не может запустить другой для DBUnit, поэтому он продолжает работать сactionManagerTarget и, следовательно, не будет выполнять откат данных DBUnit. Я думаю, что попробовал все, что мог, используя аннотации, но не повезло. Brad
Мое понимание того, почему это не сработает, заключается в том, что@Before а также@Test методы будут выполняться в одной транзакции, и я не могу указать более одной аннотации @Transactional. В вашем ответе я не вижу, как это говоритtransactionManager откат. Я что-то пропустил? Хороший момент при использовании<qualifier> хоть. Brad
0

Error: User Rate Limit Exceeded@Transactional("transactionManagerTarget")Error: User Rate Limit Exceeded@Transactional("transactionManager")Error: User Rate Limit ExceededdefaultRollback = trueError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

  • Using an in-memory database such as H2 instead of your production database- you could configure this to drop all of its data when required.
  • Allow DBUnit to commit, and have a compensating transaction in your tear-down method to clear the data out.
Я пытался выделить вспомогательный компонент, но это не помогло. Где-то под капотом DBUnit не будет откатываться при наличии нескольких транзакций Manager. Я собираюсь принять ваш ответ за использование HSQL в качестве пути продвижения вперед, однако в моем случае я все еще застрял, потому что я использую Sybase для создания временной таблицы на этом источнике данных, а синтаксис не совместим с HSQL. Brad
1

Error: User Rate Limit ExceededError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

Спасибо за ваш ответ. DBUnit используется только для загрузки тестовых данных, потому что этот источник данных уже будет заполнен в рабочей среде другой службой. Таким образом, у меня нет проблем с XA на производстве, поскольку я пишу только в один целевой источник данных. Мне нравится ваша идея использовать HSQL для моего & quot; источника & quot; источник данных. Мне просто нужно выяснить, как хранить мою схему для загрузки HSQL и поддерживать ее в соответствии со схемой Sybase. Brad
Любой JTA TM мне не подходит, потому что оба моих источника данных не-XA. Большинство JTA TM позволяют вам привлекатьone источник данных не-XA, но не более Brad
Очень длинный выстрел, но что за ... Пропустите HQSQL, используйте Apache Derby для одного из источников данных (источник). Не можете ли вы сохранить схему в виде test / resources / source_db_setup.sql? Дерби включен XA. Тогда вы можете использовать sybase в качестве источника не-xa. Я думаю, что у вас должен быть какой-то другой вариант, хотя в настоящий момент у меня нет хорошей идеи.

Похожие вопросы