spring 相关的配置
<!-- --> <bean id="car_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="default" dependency-check="default"> <property name="driverClass"> <value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="minPoolSize" value="2" /> <property name="maxPoolSize" value="5" /> <property name="initialPoolSize" value="2" /> <property name="maxIdleTime" value="30000" /> <property name="acquireIncrement" value="1" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="acquireRetryAttempts" value="30" /> <property name="breakAfterAcquireFailure" value="true" /> <property name="testConnectionOnCheckout" value="false" /> <property name="properties"> <props> <prop key="bigStringTryClob">true</prop> <prop key="clientEncoding">GBK</prop> <prop key="serverEncoding">GBK</prop> </props> </property> </bean> <bean id="biap_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" lazy-init="default" dependency-check="default"> <property name="driverClass"> <value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> <property name="minPoolSize" value="2" /> <property name="maxPoolSize" value="5" /> <property name="initialPoolSize" value="2" /> <property name="maxIdleTime" value="30000" /> <property name="acquireIncrement" value="1" /> <property name="idleConnectionTestPeriod" value="1800" /> <property name="acquireRetryAttempts" value="30" /> <property name="breakAfterAcquireFailure" value="true" /> <property name="testConnectionOnCheckout" value="false" /> <property name="properties"> <props> <prop key="bigStringTryClob">true</prop> <prop key="clientEncoding">GBK</prop> <prop key="serverEncoding">GBK</prop> </props> </property> </bean> <aop:config> <aop:advisor pointcut="execution(* com.hhb.biap.*.service..*.*(..))" advice-ref="biap_txAdvice" /> </aop:config> <tx:advice id="biap_txAdvice" transaction-manager="biap_transactionManager" > <tx:attributes> <tx:method name="create*" /> <tx:method name="modify*" /> <tx:method name="insert*" /> <tx:method name="update*" /> <tx:method name="delete*" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:advisor pointcut="execution(* com.hhb.car.*.service..*.*(..))" advice-ref="car_txAdvice" /> </aop:config> <tx:advice id="car_txAdvice" transaction-manager="car_transactionManager" > <tx:attributes> <tx:method name="create*" /> <tx:method name="modify*" /> <tx:method name="insert*" /> <tx:method name="update*" /> <tx:method name="delete*" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice>
单元测试类:
@ContextConfiguration(locations = {"classpath:spring/common/dataSource.xml","classpath:spring/common/applicationContext.xml", "classpath:spring/car/car.xml","classpath:spring/car/car-dao.xml", "classpath:spring/biap/biap.xml","classpath:spring/biap/biap-dao.xml"}) public abstract class BaseTest extends AbstractTransactionalJUnit4SpringContextTests { //自动装配默认是根据类型类匹配的,用@Qualifier 可以指定具体的数据源 @Autowired public void setDataSource(@Qualifier("car_dataSource") DataSource dataSource) { this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource); } } public class BasedaoTest extends BaseTest{ @Resource(name="carBaseDAO") BaseDAO carBaseDAO; private String namespace="car_type."; @Test public void batchDelete() { List<Integer> list=new ArrayList<Integer>(); for (int i=2;i<10;i++) { list.add(i); } this.carBaseDAO.batchDelete(namespace, "deleteCarType", list); } }
运行之后报错
[WARN ] 2012-07-06 10:58:20 :Caught exception while retrieving transaction manager with bean name [transactionManager] for test context [[TestContext@d12eea testClass = BasedaoTest, locations = array<String>['classpath:spring/common/dataSource.xml', 'classpath:spring/common/applicationContext.xml', 'classpath:spring/car/car.xml', 'classpath:spring/car/car-dao.xml', 'classpath:spring/biap/biap.xml', 'classpath:spring/biap/biap-dao.xml'], testInstance = com.hhb.car.dao.test.BasedaoTest@15f157b, testMethod = batchDelete@BasedaoTest, testException = [null]]] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146) at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292) at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270) at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332) at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) [WARN ] 2012-07-06 10:58:20 :Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@b6ef8] to process 'before' execution of test method [public void com.hhb.car.dao.test.BasedaoTest.batchDelete()] for test instance [com.hhb.car.dao.test.BasedaoTest@15f157b] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146) at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292) at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270) at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332) at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
经过断点跟踪调试:
org.springframework.test.context.transaction.TransactionalTestExecutionListener
private TransactionConfigurationAttributes retrieveTransactionConfigurationAttributes(Class<?> clazz) { Class<TransactionConfiguration> annotationType = TransactionConfiguration.class; TransactionConfiguration config = clazz.getAnnotation(annotationType); if (logger.isDebugEnabled()) { logger.debug("Retrieved @TransactionConfiguration [" + config + "] for test class [" + clazz + "]"); } String transactionManagerName; boolean defaultRollback; if (config != null) { transactionManagerName = config.transactionManager(); defaultRollback = config.defaultRollback(); } else { transactionManagerName = (String) AnnotationUtils.getDefaultValue(annotationType, "transactionManager"); defaultRollback = (Boolean) AnnotationUtils.getDefaultValue(annotationType, "defaultRollback"); } TransactionConfigurationAttributes configAttributes = new TransactionConfigurationAttributes(transactionManagerName, defaultRollback); if (logger.isDebugEnabled()) { logger.debug("Retrieved TransactionConfigurationAttributes [" + configAttributes + "] for class [" + clazz + "]"); } return configAttributes; }
默认它会加上事务,事务管理默认的bean名称是transactionManager,因为配置中没有这个bean 的配置,所以抛出异常,这个 TransactionConfiguration config = clazz.getAnnotation(annotationType);
我们没有在测试类上注释,所以为null,去取默认的transactionManager。
我们可以这样做
@TransactionConfiguration(transactionManager="car_transactionManager") public class BasedaoTest extends BaseTest{ }
相关推荐
在SpringMVC框架中配置多数据源是一项常见的需求,尤其在大型企业级应用中,由于业务的复杂性,往往需要连接不同的数据库以满足不同模块的需求。以下将详细讲解如何实现这一功能。 首先,理解数据源(DataSource)...
Spring的`@Transactional`注解默认不支持多数据源,可能需要自定义TransactionManager和PlatformTransactionManager来处理跨数据源的事务。 6. **测试和调试**: - 测试多数据源配置时,确保每个数据源都能正常...
7. **测试和优化**:完成配置后,通过单元测试或集成测试确保多数据源功能正常工作。同时,为了提高性能和减少资源消耗,可以考虑使用连接池,如Druid或HikariCP。 8. **安全性考虑**:处理多数据源时,要注意权限...
本项目是一个基于Spring Boot的多数据源测试源码示例,已经经过测试验证,可以顺利运行。 首先,我们要理解Spring Boot如何集成JPA(Java Persistence API),这是Spring提供的一个ORM(对象关系映射)框架,支持...
"springmvc_mybatis_多数据源"这个项目就是针对这种情况提供的一种解决方案。 首先,我们来看SpringMVC如何处理多数据源。在SpringMVC中,我们可以利用Spring的DataSourceTransactionManager和...
Spring MVC + Shiro + QueryDSL + JPA 框架多数据源配置详细说明 Spring MVC + Shiro + QueryDSL + JPA 框架多数据源配置是当前 Web 应用程序中常见的技术栈组合。该技术栈组合可以提供强大的安全认证、数据查询和...
9. **测试**:编写单元测试或集成测试,验证多数据源配置是否正确工作。 在"Spring+Hibernate+DEMO"这个项目中,你可以找到具体的配置文件(如`applicationContext.xml`或`application.properties`)、Java配置类...
标题:"2771885 - TransactionManager is not ready" 指的可能是SAP系统中的一则官方技术支持文档编号(SAP Note),它描述了与SAP系统中 TransactionManager 服务有关的技术问题。在SAP系统中,TransactionManager...
6. **测试与监控**:最后,别忘了编写测试用例来验证多数据源配置的正确性,并使用监控工具(如Spring Actuator)监控数据源的使用情况,确保系统的稳定运行。 综上所述,"cxf多数据源配置"是一个涉及CXF、Spring和...
这通常需要自定义TransactionManager,或者利用AbstractRoutingDataSource的特性,使其能够处理多数据源的事务。 4. **Mybatis集成**:为每个数据源创建一个SqlSessionFactory,并在Mybatis的配置中指定对应的...
4. 测试用例:包含了对多数据源和分布式事务功能的测试,验证事务的一致性和隔离性。 综上所述,Spring Boot通过其强大的框架能力,为开发者提供了实现多数据源操作、分布式事务管理和多线程支持的解决方案。开发者...
2. **配置事务管理器**:由于多数据源环境下事务管理较为复杂,需要配置一个支持多数据源的事务管理器,例如`DataSourceTransactionManager`。你需要为每个数据源创建一个事务管理器,并指定对应的数据源bean。 ``...
在Spring Boot应用中,多数据源的配置与事务管理是一项重要的功能,特别是在大型分布式系统中,可能需要连接多个数据库以实现数据隔离或者扩展性。本文将深入探讨Spring Boot如何实现多数据源配置以及多数据源事务...
4. 测试策略:如何在测试环境中模拟多数据源,并确保测试的隔离性。 通过理解和掌握这些知识点,你可以有效地在Spring应用中实现和管理MySQL的多数据源架构,从而提高系统的可扩展性和灵活性。
"Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了系统的灵活性和可扩展性。下面我们将详细探讨如何在Spring中实现多数据源的配置及动态切换。 首先,我们...
在某些复杂的应用场景中,一个项目可能需要连接并操作多个不同的数据库,这就是所谓的“多数据源”架构。MySQL作为广泛使用的开源关系型数据库,其多数据源连接是实现这种架构的关键技术。下面我们将详细探讨如何在...
对于多数据源,Spring的PlatformTransactionManager需要适配,可能需要自定义TransactionManager实现,或者使用Spring的AbstractRoutingDataSource来处理事务的边界。 总的来说,Java Spring Boot结合Druid实现多...
在Spring Boot应用中整合MyBatis并配置多数据源是一项常见的任务,这使得应用程序能够根据需求切换或同时处理多个数据库。下面将详细讲解这个过程的关键步骤、涉及的技术点以及注意事项。 1. **Spring Boot与...
本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...
3. **配置多数据源**:在Spring的XML配置文件中,我们需要定义多个DataSource bean,分别代表不同的数据库连接。这些数据源可以是Apache Commons DBCP、HikariCP、Druid等连接池的实现。例如: ```xml <bean id=...