开发者社区> 问答> 正文

求解:spring结合mybatis配置多数据源报错 : 配置报错 

项目中要操作多个数据库的表,因此要配置多个数据源,配置如下:
<context:property-placeholder location="classpath:config/jdbc.properties" />

    <!-- DataSource数据源,使用c3p0连接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}"></property> <property name="jdbcUrl"     value="${jdbc.url}"></property> <property name="user"        value="${jdbc.username}"></property> <property name="password"    value="${jdbc.password}"></property> <property name="minPoolSize" value="20"></property> <property name="maxPoolSize" value="40"></property> <property name="initialPoolSize" value="20"></property>  <property name="maxIdleTime" value="10000"></property> <property name="acquireIncrement" value="10"></property> <property name="maxStatements" value="0"></property> <property name="idleConnectionTestPeriod" value="60"></property> </bean>

<!-- pojo 映射 -->     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">         <property name="dataSource" ref="dataSource" />         <property name="configLocation" value="classpath:mybatis/mybatis-config-service.xml"/>         <!--define entity package  -->         <property name="typeAliasesPackage" value="com.app.anilys.dc.domain." />     </bean>          <!-- 数据源2配置 start --> <bean id="activityDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}"></property> <property name="jdbcUrl"     value="${jdbc.activity.url}"></property> <property name="user"        value="${jdbc.username}"></property> <property name="password"    value="${jdbc.password}"></property> <property name="minPoolSize" value="20"></property> <property name="maxPoolSize" value="40"></property> <property name="initialPoolSize" value="20"></property>  <property name="maxIdleTime" value="10000"></property> <property name="acquireIncrement" value="10"></property> <property name="maxStatements" value="0"></property> <property name="idleConnectionTestPeriod" value="60"></property> </bean> <bean id="activitySqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">         <property name="dataSource" ref="activityDataSource" />         <property name="configLocation" value="classpath:mybatis/mybatis-config-activity.xml"/>         <property name="typeAliasesPackage" value="com.app.anilys.dc.domain." />     </bean> <!-- 数据源2配置 end -->           <!-- 自动扫描组件,这里要把controler下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。   --> <context:component-scan base-package="com.app.anilys.dc">         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />      </context:component-scan>         <!-- @AspectJ的支持,从而可以实现通过注解方式将通知编织到非公共方法中。 -->     <aop:aspectj-autoproxy proxy-target-class="true"/>         <!-- 扫描mapper -->     <bean name="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">       <property name="basePackage" value="com.app.anilys.dc.dao." />       <property name="sqlSessionFactory" ref="sqlSessionFactory" />     </bean>    
    <bean name="activityMapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">       <property name="basePackage" value="com.app.anilys.dc.dao.
" />       <property name="sqlSessionFactory" ref="activitySqlSessionFactory" />     </bean>

<!-- dao 事务 -->     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">         <property name="dataSource" ref="dataSource" />     </bean>     <!-- 数据源2事务管理器配置 start -->     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">         <property name="dataSource" ref="activityDataSource" />     </bean>     <!-- 数据源2事务管理器配置 end -->          <!-- spring 声明事务管理 --> <aop:config> <aop:pointcut id="fooServiceMethods" expression="execution(* com.app.anilys.dc.serviceimpl...(..))"/>          <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>  </aop:config> <aop:config> <aop:pointcut id="controllerMethods" expression="execution( com.app.anilys.dc.controller...*(..))"/>          <aop:advisor advice-ref="txAdvice" pointcut-ref="controllerMethods"/>  </aop:config>

<!-- 数据源2事务通知配置 start --> <aop:config> <aop:pointcut id="activityFooServiceMethods" expression="execution(* com.app.anilys.dc.serviceimpl...(..))"/>          <aop:advisor advice-ref="activityTxAdvice" pointcut-ref="activityFooServiceMethods"/>  </aop:config> <aop:config> <aop:pointcut id="activityControllerMethods" expression="execution( com.app.anilys.dc.controller...*(..))"/>          <aop:advisor advice-ref="activityTxAdvice" pointcut-ref="activityControllerMethods"/>  </aop:config> <!-- 数据源2事务通知配置 end -->

<!-- 事务管理配置 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="select*" read-only="true" propagation="REQUIRED" />             <tx:method name="find*"   read-only="true" propagation="REQUIRED" />             <tx:method name="get*"   read-only="true" propagation="REQUIRED" />             <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="update*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="add*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="delete*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="start*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="" rollback-for="V20Exception"/> </tx:attributes> </tx:advice> <!-- 数据源2事务通知配置 start --> <tx:advice id="activityTxAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="select" read-only="true" propagation="REQUIRED" />             <tx:method name="find*"   read-only="true" propagation="REQUIRED" />             <tx:method name="get*"   read-only="true" propagation="REQUIRED" />             <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="update*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="add*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="delete*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="start*" propagation="REQUIRED" isolation="REPEATABLE_READ" />             <tx:method name="*" rollback-for="V20Exception"/> </tx:attributes> </tx:advice> <!-- 数据源2事务通知配置 end --> <beans>
启动tomcat,访问工程应用,报如下错误:
org.springframework.jdbc.BadSqlGrammarException:  ### Error querying database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 'ActivityUser' 无效。 但是ActivityUser在其中上述配置文件数据源为 activityDataSource的库中存在的,说明这个数据源没有起作用,运行的时候还是在数据源为 dataSource的库中去找表,所以报如上错误,烦请各位帮我看看为何数据源 activityDataSource没起作用,多个数据源该如何配置和实现呢?

展开
收起
kun坤 2020-06-04 13:13:34 701 0
1 条回答
写回答
取消 提交回答
  • 配置文件太多,眼花,目测 扫描Mapper这里有问题,两个扫描路径是一样的,怎么区分?###### 为引擎指定数据源了么?上面只看到你配置了数据源,好像没有指定吧。
        <!--流程引擎属性配置-->     <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">         <property name="dataSource" ref="dataSource"/>         <property name="idGenerator" ref="midGenerator"/>         <property name="transactionManager" ref="transactionManager"/>         <property name="databaseSchemaUpdate" value="true"/>         <!-- 允许Activit更新数据表-->         <property name="activityFontName" value="宋体"/>         <property name="labelFontName" value="宋体"/>         <property name="jobExecutorActivate" value="false"/>         <property name="history" value="full"/>         <property name="processDefinitionCacheLimit" value="10"/>     </bean> ######

    引用来自“len”的评论

    为引擎指定数据源了么?上面只看到你配置了数据源,好像没有指定吧。     <!--流程引擎属性配置-->     <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">         <property name="dataSource" ref="dataSource"/>         <property name="idGenerator" ref="midGenerator"/>         <property name="transactionManager" ref="transactionManager"/>         <property name="databaseSchemaUpdate" value="true"/>         <!-- 允许Activit更新数据表-->         <property name="activityFontName" value="宋体"/>         <property name="labelFontName" value="宋体"/>         <property name="jobExecutorActivate" value="false"/>         <property name="history" value="full"/>         <property name="processDefinitionCacheLimit" value="10"/>     </bean> 你可能误解我的意思了,这个跟流程引擎没有关系,这个activity不是工作流程引擎,而是一个名字而已,现在的问题就是配置两个数据源报错,没有起作用。######

    引用来自“huan”的评论

    配置文件太多,眼花,目测 扫描Mapper这里有问题,两个扫描路径是一样的,怎么区分? 扫描的是dao接口以及mapper.xml文件,在多数据源情况下,难道各数据源的dao文件以及mapper.xml必须放在不同的目录下吗?######

    引用来自“huan”的评论

    配置文件太多,眼花,目测 扫描Mapper这里有问题,两个扫描路径是一样的,怎么区分? 谢谢你的指点提醒,的确是扫描mapper的配置有问题,多数据源时,每个数据源的dao接口以及mapper.xml文件必须放在不同的包下。
    2020-06-05 13:16:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud 微服务核心组件集 mica 的设计思路 立即下载
workshop专场-微服务专场-开发者动手实践营-微服务-Spring Cloud Alibaba 微服务全家桶体验 立即下载
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载

相关实验场景

更多