mutliple लेनदेन प्रबंधकों संक्षेपकैसे साथ स्प्रिंग + DBUnit + JUnit
मेरे आदेश पंक्ति जावा अनुप्रयोग प्रतियां डेटा में एक डेटा स्रोत से दूसरे XA का उपयोग किए बिना कॉन्फ़िगर करने के लिए। मैं दो अलग datasources कॉन्फ़िगर किया गया है और एक JUnit परीक्षण है कि दोनों datasources पर डेटा रोलबैक कर सकते हैं करना चाहते हैं। मैं DBUnit का उपयोग "स्रोत" डेटाबेस में डेटा लोड करने के लिए है, लेकिन मैं यह रोलबैक के लिए नहीं मिल सकता है। मैं रोलबैक के लिए "लक्ष्य" डेटासोर्स प्राप्त कर सकता हूं।
मेरे कोड
इस config को देखते हुए ...
<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>
और इस कोड को ...
@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();
}
}
समस्या मैं इसे देखते हैं, है कि @TransactionConfiguration
केवल राज्यों रोलबैक सक्षम करने के लिए लक्षित डेटासॉर। DBUnit dataSourceA
स्पष्ट रूप से भेजी जा रही है और डिफ़ॉल्ट लेन-देन प्रबंधक transactionManager
नामित जो रोलबैक करने के लिए कहा नहीं किया गया है (मुझे यकीन है कि कैसे नहीं कर रहा हूँ) उठा रहा है।
प्रश्न
कैसे मैं दोनों लेन-देन प्रबंधकों रोलबैक करने के लिए बता सकते हैं?
मैं एक एकल लेनदेन प्रबंधक का उपयोग कर सकते जब मेरे datasources XA लेन-देन का समर्थन नहीं करते?
नोट: उत्पादन में चलते समय एप्लिकेशन को सोर्सए पर लेनदेन प्रबंधक की आवश्यकता नहीं होती है क्योंकि यह केवल पढ़ने के लिए ही होगी। यह मुद्दा केवल मेरे परीक्षण वर्गों के लिए है।
मैंने एक सहायक बीन फैक्टरिंग करने की कोशिश की लेकिन यह siutation की मदद नहीं करता है। हुड के नीचे कहीं डीबीयूनीट कई लेनदेन प्रबंधक होने पर रोलबैक नहीं करेगा। मैं आगे बढ़ने के रूप में HSQL का उपयोग करने के लिए अपना उत्तर स्वीकार करने जा रहा हूं, हालांकि मेरे मामले में मैं अभी भी अटक गया हूं क्योंकि मैं इस डेटासोर्स पर एक अस्थायी तालिका बनाने के लिए Sybase का उपयोग करता हूं और वाक्यविन्यास एचएसक्यूएल के साथ संगत नहीं है। – Brad