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

曾鹏 发布于 2014/06/04 20:30
阅读 2K+
收藏 1

项目中要操作多个数据库的表,因此要配置多个数据源,配置如下:

<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没起作用,多个数据源该如何配置和实现呢?


加载中
0
huan
huan
配置文件太多,眼花,目测 扫描Mapper这里有问题,两个扫描路径是一样的,怎么区分?
0
len
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>

0
曾鹏

引用来自“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不是工作流程引擎,而是一个名字而已,现在的问题就是配置两个数据源报错,没有起作用。
0
曾鹏

引用来自“huan”的评论

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

引用来自“huan”的评论

配置文件太多,眼花,目测 扫描Mapper这里有问题,两个扫描路径是一样的,怎么区分?
谢谢你的指点提醒,的确是扫描mapper的配置有问题,多数据源时,每个数据源的dao接口以及mapper.xml文件必须放在不同的包下。
返回顶部
顶部