在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库。Master库负责数据更新和实时数据查询,Slave库当然负责非实时数据查询。因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。

废话不多说,多数据源配置和主从数据配置原理一样
1、首先配置 jdbc.properties 两个数据库 A 和 B
#============ 双数据源 ======# #----------------------A servers--------------------------# A.driver=com.mysql.jdbc.Driver A.url=jdbc:mysql://localhost:3619/gps4?useUnicode=true&characterEncoding=utf8 A.username=gpsadmin A.password=1qaz&619 #----------------------B servers--------------------------# B.driver=com.mysql.jdbc.Driver B.url=jdbc:mysql://localhost:3619/gps6?useUnicode=true&characterEncoding=utf8 B.username=gpsadmin B.password=1qaz&619
2、配置 spring-mybatis.xml 文件【重要】
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:resources/jdbc.properties" />
</bean>
<!-- DBCP连接池 -->
<!-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"> <property name="driverClassName" value="${driver}"
/> <property name="url" value="${url}" /> <property name="username" value="${username}"
/> <property name="password" value="${password}" /> 初始化连接大小 <property name="initialSize"
value="${initialSize}"></property> 连接池最大数量 <property name="maxActive" value="${maxActive}"></property>
连接池最大空闲 <property name="maxIdle" value="${maxIdle}"></property> 连接池最小空闲 <property
name="minIdle" value="${minIdle}"></property> 获取连接最大等待时间 <property name="maxWait"
value="${maxWait}"></property> </``> -->
<!-- 【重点】 A 数据源 -->
<bean name="dataSourceA" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${A.driver}" />
<property name="url" value="${A.url}" />
<property name="username" value="${A.username}" />
<property name="password" value="${A.password}" />
</bean>
<!-- 【重点】 B 数据源 -->
<bean name="dataSourceB" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${B.driver}" />
<property name="url" value="${B.url}" />
<property name="username" value="${B.username}" />
<property name="password" value="${B.password}" />
</bean>
<!--【重点】 双数据源 配合 -->
<bean id="dataSource" class="com.ifengSearch.common.database.DynamicDataSource">
<property name="defaultTargetDataSource" ref="dataSourceB"/>
<property name="targetDataSources">
<map>
<entry key="dataSourceA" value-ref="dataSourceA"/>
<entry key="dataSourceB" value-ref="dataSourceB"/>
</map>
</property>
</bean>
<!-- 【重点】 加入 aop 自动扫描 DataSourceAspect 配置数据库注解aop -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="manyDataSourceAspect" class="com.ifengSearch.common.database.DataSourceAspect" />
<aop:config>
<!-- 扫描 注解的 数据源 -->
<aop:aspect id="c" ref="manyDataSourceAspect">
<aop:pointcut id="tx" expression="execution(* com.ifengSearch.*.dao.*.*(..))"/>
<aop:before pointcut-ref="tx" method="before"/>
</aop:aspect>
</aop:config>
<!-- 配置数据连接 工厂 自动扫描mapping.xml文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/ifengSearch/*/mapping/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ifengSearch.*.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx 事务 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
3、编写几个java类动态调用数据源【重要】
a:自定义一个注解,负责动态调用数据源
package com.ifengSearch.common.database;
import java.lang.annotation.*;
/**
* 设置 数据源 注解标签的用法 写上注解标签,
* 调用相应方法切换数据源咯(就跟你设置事务一样)
* 【也可以配置 主从数据库】
*
* @author flm
* @2017年9月12日
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
public static String dataSourceA = "dataSourceA"; // A数据源
public static String dataSourceB = "dataSourceB"; // B数据源
String value();
}
b、数据源的获取 Object aop实现 (反射)
package com.ifengSearch.common.database;
import java.lang.reflect.Method;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
/**
* 数据源的获取
* aop实现 (反射)
* @author flm
* @2017年9月12日
*/
public class DataSourceAspect{
private Logger log = Logger.getLogger(DataSourceAspect.class);
public void before(JoinPoint point)
{
Object target = point.getTarget();// 拦截的实体类
String method = point.getSignature().getName();// 拦截的方法名称
Class<?>[] classz = target.getClass().getInterfaces();
Class<?>[] parameterTypes = ((MethodSignature) point.getSignature())
.getMethod().getParameterTypes();// 拦截的方法参数类型
try {
Method m = classz[0].getMethod(method, parameterTypes);
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource data = m
.getAnnotation(DataSource.class);
DataSourceHolder.setDataSource(data.value());
log.info("数据源的获取 DataSource: "+data.value());
}
} catch (Exception e) {
log.error("数据源的获取 aop实现 出错:"+e.getMessage());
}
}
}
c、DataSourceHolder 数据源操作 获取数据源 帮助类
package com.ifengSearch.common.database;
/**
* 多数据源
* 数据源操作 获取数据源
* @author flm
* @2017年9月12日
*/
public class DataSourceHolder {
//线程本地环境
private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();
//设置数据源
public static void setDataSource(String customerType) {
dataSources.set(customerType);
}
//获取数据源
public static String getDataSource() {
return (String) dataSources.get();
}
//清除数据源
public static void clearDataSource() {
dataSources.remove();
}
}
d、 我们还需要实现spring的抽象类AbstractRoutingDataSource,就是实现determineCurrentLookupKey方法:
package com.ifengSearch.common.database;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/**
* 多数据源
* 获取数据源(依赖于spring)
* @author flm
* @2017年9月12日
*/
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceHolder.getDataSource();
}
}
4、接下来就可以看结果了
我在dao层直接调用
public interface UserDao {
/**
* 登录判断 【数据源B】
*/
@DataSource(value=DataSource.dataSourceB)
public List<UserBean> getLoginUserList(@Param("loginName")String loginName,@Param("loginPwd")String loginPwd);
/**
* 查找上一级 服务商 【数据源A】
*/
@DataSource(value=DataSource.dataSourceA)
public UserBean getServerUser(@Param("u_last_id")Integer u_last_id);
}
总结
以上所述是小编给大家介绍的Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# mybatis
# 读写分离
# aop
# spring
# aop读写分离
# Spring AOP使用接口方式实现
# Springboot接口项目如何使用AOP记录日志
# Spring AOP实现Redis缓存数据库查询源码
# Spring AOP切面解决数据库读写分离实例详解
# 使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)
# Spring AOP实现接口请求记录到数据库的示例代码
# 连接池
# 多个
# 新和
# 小编
# 都是
# 数据查询
# 几个
# 我在
# 在此
# 给大家
# 跟你
# 较多
# 自定义
# 还需要
# 多说
# 较少
# 较长
# 所述
# 写上
# 给我留言
相关文章:
如何在香港免费服务器上快速搭建网站?
如何自定义建站之星模板颜色并下载新样式?
定制建站如何定义?其核心优势是什么?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
如何获取开源自助建站系统免费下载链接?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
建站主机无法访问?如何排查域名与服务器问题
山东云建站价格为何差异显著?
建站主机是否属于云主机类型?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
广平建站公司哪家专业可靠?如何选择?
网站制作员失业,怎样查看自己网站的注册者?
PHP 500报错的快速解决方法
网站制作企业,网站的banner和导航栏是指什么?
如何快速上传建站程序避免常见错误?
如何通过建站之星自助学习解决操作问题?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
高性价比服务器租赁——企业级配置与24小时运维服务
建站之星如何取消后台验证码生成?
MySQL查询结果复制到新表的方法(更新、插入)
如何批量查询域名的建站时间记录?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
电商网站制作公司有哪些,1688网是什么意思?
如何配置IIS站点权限与局域网访问?
教程网站设计制作软件,怎么创建自己的一个网站?
文字头像制作网站推荐软件,醒图能自动配文字吗?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星安装提示数据库无法连接如何解决?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
如何在腾讯云服务器快速搭建个人网站?
如何在万网自助建站平台快速创建网站?
网站制作话术技巧,网站推广做的好怎么话术?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
如何通过万网虚拟主机快速搭建网站?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
建站之星2.7模板快速切换与批量管理功能操作指南
内部网站制作流程,如何建立公司内部网站?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
专业网站建设制作报价,网页设计制作要考什么证?
如何通过FTP服务器快速搭建网站?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
建站之星3.0如何解决常见操作问题?
香港网站服务器数量如何影响SEO优化效果?
代购小票制作网站有哪些,购物小票的简要说明?
南京网站制作费用,南京远驱官方网站?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
*请认真填写需求信息,我们会在24小时内与您取得联系。