最近需要配置多数据源的问题,根据资料我进行了以下配置,但是运行时总是无法切换数据源
一、项目目录结构

二、注解类

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSourceInf {String value() default DataSource.DATASOURCE_DEFAULT;
}

三、数据源类

public class DataSource {/*** 读写数据库*/public static final String DATASOURCE_DEFAULT = "dataSource";/*** 只读数据库*/public static final String DATASOURCE_READ = "dataSource_read";/*** 只读数据库*/public static final String DATASOURCE_WRITE = "dataSource_write";}

四、AOP拦截类

@Order(0)
@Aspect
@Component
public class DynamicDataSourceAspect {@Around("within(com.thinkgem.jeesite.modules.wql.service..*) && @annotation(db)")public Object doBasicProfiling(ProceedingJoinPoint pjp, DataSourceInf db) throws Throwable {DynamicDataSource.setDataSource(db.value());Object object = null;try {object = pjp.proceed();} catch (Exception e) {e.printStackTrace();throw e;}// 继续执行该方法DynamicDataSource.setDefault();return object;}
}

五、

DynamicDataSource.java
public class DynamicDataSource extends AbstractRoutingDataSource {private  static final ThreadLocal<String> holder = new ThreadLocal<String>();public static void setDataSource(String dbType) {holder.set(dbType);}public static void setDefault() {holder.set("dataSource");}@Overrideprotected Object determineCurrentLookupKey() {return holder.get();}
}

六、配置数据源,jeesit.properties

jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jeesite?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=admin#mysql database setting
jdbc2.driver=com.mysql.jdbc.Driver
jdbc2.url=jdbc:mysql://197.2.127.11:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
jdbc2.username=root
jdbc2.password=admin#mysql database setting
jdbc3.driver=com.mysql.jdbc.Driver
jdbc3.url=jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8
jdbc3.username=root
jdbc3.password=admin

七、配置文件,spring-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc"  xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:util="http://www.springframework.org/schema/util" xmlns:task="http://www.springframework.org/schema/task"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"default-lazy-init="true"><description>Spring Configuration</description><!-- 加载配置属性文件 --><context:property-placeholder ignore-unresolvable="true" location="classpath:jeesite.properties" /><!-- 加载应用属性实例,可通过  @Value("#{APP_PROP['jdbc.driver']}") String jdbcDriver 方式引用 --><util:properties id="APP_PROP" location="classpath:jeesite.properties" local-override="true"/><!-- 使用Annotation自动注册Bean,解决事物失效问题:在主容器中不扫描@Controller注解,在SpringMvc中只扫描@Controller注解。  --><context:component-scan base-package="com.thinkgem.jeesite"><!-- base-package 如果多个,用“,”分隔 --><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- MyBatis begin --><bean id="dynamicDataSource" class="com.thinkgem.jeesite.common.db.DynamicDataSource"><property name="defaultTargetDataSource" ref="dataSource"></property><property name="targetDataSources"><map key-type="java.lang.String"><entry value-ref="dataSource" key="dataSource"></entry><entry value-ref="dataSource_read" key="dataSource_read"></entry><entry value-ref="dataSource_write" key="dataSource_write"></entry></map></property></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dynamicDataSource"/><property name="typeAliasesPackage" value="com.thinkgem.jeesite"/><property name="typeAliasesSuperType" value="com.thinkgem.jeesite.common.persistence.BaseEntity"/><property name="mapperLocations" value="classpath:/mappings/**/*.xml"/><property name="configLocation" value="classpath:/mybatis-config.xml"></property></bean><!-- 扫描basePackage下所有以@MyBatisDao注解的接口 --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /><property name="basePackage" value="com.thinkgem.jeesite"/><property name="annotationClass" value="com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao"/></bean><!-- 定义事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dynamicDataSource" /></bean><!-- 配置 Annotation 驱动,扫描@Transactional注解的类定义事务  --><tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/><!-- MyBatis end --><!-- 配置 JSR303 Bean Validator 定义 --><bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /><!-- 缓存配置 --><bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><property name="configLocation" value="classpath:${ehcache.configFile}" /></bean><!-- 计划任务配置,用 @Service @Lazy(false)标注类,用@Scheduled(cron = "0 0 2 * * ?")标注方法 --><task:executor id="executor" pool-size="10"/> <task:scheduler id="scheduler" pool-size="10"/><task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true"/><!-- 数据源配置, 使用 BoneCP 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><property name="driverClassName" value="${jdbc.driver}" /><!-- 基本属性 url、user、password --><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}" /><property name="minIdle" value="${jdbc.pool.minIdle}" /> <property name="maxActive" value="${jdbc.pool.maxActive}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="${jdbc.testSql}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)<property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --><!-- 配置监控统计拦截的filters --><property name="filters" value="stat" /> </bean><!-- 数据源配置, 使用 BoneCP 数据库连接池 --><bean id="dataSource_read" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><property name="driverClassName" value="${jdbc2.driver}" /><!-- 基本属性 url、user、password --><property name="url" value="${jdbc2.url}" /><property name="username" value="${jdbc2.username}" /><property name="password" value="${jdbc2.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}" /><property name="minIdle" value="${jdbc.pool.minIdle}" /><property name="maxActive" value="${jdbc.pool.maxActive}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="${jdbc.testSql}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)<property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --><!-- 配置监控统计拦截的filters --><property name="filters" value="stat" /></bean><!-- 数据源配置, 使用 BoneCP 数据库连接池 --><bean id="dataSource_write" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><property name="driverClassName" value="${jdbc3.driver}" /><!-- 基本属性 url、user、password --><property name="url" value="${jdbc3.url}" /><property name="username" value="${jdbc3.username}" /><property name="password" value="${jdbc3.password}" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}" /><property name="minIdle" value="${jdbc.pool.minIdle}" /><property name="maxActive" value="${jdbc.pool.maxActive}" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="${jdbc.testSql}" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用)<property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> --><!-- 配置监控统计拦截的filters --><property name="filters" value="stat" /></bean><!-- 配置AOP --><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy><!-- 数据源配置, 使用应用服务器的数据库连接池 <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/jeesite" />--><!-- 数据源配置, 不使用连接池 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean>--></beans>

八,测试类  TUserService.java

@Service
@Transactional(readOnly = true)
public class TUserService extends CrudService<TUserDao, TUser> {@AutowiredTUserDao tUserDao;public TUser get(String id) {return super.get(id);}public List<TUser> findList(TUser tUser) {return super.findList(tUser);}@DataSourceInf(DataSource.DATASOURCE_READ)public List<TUser> getAllList() {//DynamicDataSource.setDataSource(DataSource.DATASOURCE_READ);List list = tUserDao.getAllList();System.out.println("<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>"+list.toString());return list;}public Page<TUser> findPage(Page<TUser> page, TUser tUser) {return super.findPage(page, tUser);}@Transactional(readOnly = false)public void save(TUser tUser) {super.save(tUser);}@Transactional(readOnly = false)public void delete(TUser tUser) {super.delete(tUser);}}

运行结果:

错误信息:
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeesite.t_user' doesn't exist
### The error may exist in file [E:\soft\jeesite-master\target\jeesite\WEB-INF\classes\mappings\modules\wql\TUserDao.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT a.id AS "id", a.user_name AS "userName", a.password AS "password", a.role_id AS "roleId", a.true_name AS "trueName", a.create_time AS "createTime", a.modify_time AS "modifyTime" FROM t_user a where 1=1
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeesite.t_user' doesn't exist
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jeesite.t_user' doesn't exist

有以下两个问题:

问题1、上面在service层不管是以注解的形式,还是以(

DynamicDataSource.setDataSource(DataSource.DATASOURCE_READ)

)的形式,都报上面的错误,找不到表,这应该就是没有正确的切换数据源,不知道问题具体出在哪里?经过测试,如果控制在controller中(以

DynamicDataSource.setDataSource(DataSource.DATASOURCE_READ)

)的形式进行切换是可以的。

问题2、我又换了一种方式,如果在DAO中进行注解,则根本无法进入AOP拦截中,配置如下

(1)、DAO类  TUserDao.java

@MyBatisDao
@DataSourceInf(DataSource.DATASOURCE_READ)
public interface TUserDao extends CrudDao<TUser> {@DataSourceInf(DataSource.DATASOURCE_READ)public List<TUser> getAllList();
}

(2)、AOP拦截类  DynamicDataSourceAspect.java

该类只修改了需要拦截的文件路径

@Around("within(com.thinkgem.jeesite.modules.wql.dao..*) && @annotation(db)")

修改完毕后,运行后则根本没有进入AOP拦截类,是不是因为DAO是一个接口?

求大神解答,谢谢。

jeesit 基于springMVC + mybatis配置多数据源的问题相关推荐

  1. Springboot环境下mybatis配置多数据源配置

    mybatis多数据源配置(本文示例为两个),方便实现数据库的读写分离,分库分表功能 本文基于springboot2进行的配置,如版本为springboot1系列则需修改yml的配置(在文末附带) m ...

  2. spring+springmvc+mybatis配置

    2019独角兽企业重金招聘Python工程师标准>>> <?xml version="1.0" encoding="UTF-8"?> ...

  3. springmvc连接mysql_挺详细的spring+springmvc+mybatis配置整合|含源代码

    大家好,我是雄雄,今天来带着大家来配置一下SSM(spring+springmvc+ mybatis)框架. 01 新建java web项目 直接在myeclipse中,新建一个web项目即可. 02 ...

  4. mybatis配置mysql数据源_springboot+mybatis+Druid配置多数据源(mysql+postgre)

    springboot+mybatis+Druid配置多数据源(mysql+postgre) 引入pom依赖 org.mybatis.spring.boot mybatis-spring-boot-st ...

  5. 【spring boot】 mybatis配置双数据源/多数据源

    前言 spring boot 2.0.0.RELEASE maven 3.5 eclipse 4.9.0 mybatis 1.3.2 mybatis generator 1.3.2 pagehelpe ...

  6. SpringBoot中mybatis配置多数据源

    首先需要创建多个数据库 简单的user表 CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAU ...

  7. mybatis多数据源配置_随笔:springboot+mybatis 配置双数据源

    山石彦 | 作者 urlify.cn/vQzIne | 来源 最近工作中有用到双数据源,一个项目(中台)中需要操作两个不同的数据库.当时考虑到了两种方式, 1.通过http请求访问(A项目访问d1数据 ...

  8. Mybatis配置多数据源

    在项目中经常会存在操作不同数据库得情况,最为典型就是后管系统,如果不走接口进行调用,那么势必会有多个数据源作为数据管理的得突破口.在此我们可以想一下到底是微服务接口暴露模式的后管好还是基于多数据源的模 ...

  9. SpringBoot实战(三):整合Mybatis配置多数据源

    [前言] 最近接到一个新需求,经过分析后做了相应的设计:其中需要在一个项目中操做不同的数据源:于是进行了相关验证:在此记录一下验证过程. [实战多数据源]          一.Pom中引入相应的Ja ...

  10. mybatis 配置多数据源 java,SpringBoot+MyBatisPlus配置多数据源读写分离

    首先呢,我们这里使用MySQL的数据库,可以简单配置一下主从备份来实现两个数据库的数据同步 项目的配置目录大概是这样的作为参考 第一步.定义一个枚举类声明当前的数据源类型 package com.yu ...

最新文章

  1. 团队-象棋游戏-模块测试过程
  2. hibernate的inverse用法
  3. python aiohttp_aiohttp
  4. 如何找到SAP ECC事务码升级到S4HANA后对应的新事务码
  5. linux编译动态库之-fPIC
  6. 中国软件离制造业还是太远
  7. OA报账规范(出差专用)
  8. 如何用python计算行列式_Python入门教程: 计算范德蒙矩阵的行列式
  9. scrapy项目-爬取阳光问政
  10. 国外11个高质量免费的3D素材网站-建筑设计/室内设计/效果图渲染
  11. 强化学习(4):策略梯度Policy Gradient算法
  12. 【计算机三级信息安全】访问控制模型
  13. Windows/Linux内核地址空间管理的异同
  14. 操作数据库方法总结1——JDBC、连接池与JDBCTemplate
  15. 西湖大学正式开学! 120名博士新生入校,每月补助5000多元
  16. 通信协议英语单词解析
  17. 使用canvas制作背景水印
  18. vue2一天时间段选择库(drag-weektime)代码学习
  19. React + Ts项目搭建
  20. 仿ifeng可翻阅上下滚动新闻

热门文章

  1. 32款图片处理软件介绍
  2. kali2022.2无线网络WiFi破解详解
  3. 安卓天天练练(五)CompoundButton
  4. android各版本源码下载
  5. centos7安装nexus3
  6. 计算机基本概念--超标量,多发射
  7. java 身份证地址提取籍贯_输入身份证号获取籍贯、出生日期、性别
  8. 《善用佳软:高效能人士的软件应用之道》一2.6 小工具之计算器
  9. 38张史上最全的IT架构师技能图谱(高清版下载)
  10. 读取金税盘、税控盘或税务Ukey基本信息