spring aop , mysql 主从配置 实现读写分离,接下来把自己的配置过程,以及遇到的问题记录下来,方便下次操作,也希望给一些朋友带来帮助。

1.使用spring aop 拦截机制现数据源的动态选取。
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* RUNTIME
* 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
* @author yangGuang
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
String value();
}
3.利用Spring的AbstractRoutingDataSource解决多数据源的问题
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class ChooseDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return HandleDataSource.getDataSource();
}
}
4.利用ThreadLocal解决线程安全问题
public class HandleDataSource {
public static final ThreadLocal<String> holder = new ThreadLocal<String>();
public static void putDataSource(String datasource) {
holder.set(datasource);
}
public static String getDataSource() {
return holder.get();
}
}
5.定义一个数据源切面类,通过aop访问,在spring配置文件中配置了,所以没有使用aop注解。
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
//@Aspect
//@Component
public class DataSourceAspect {
//@Pointcut("execution(* com.apc.cms.service.*.*(..))")
public void pointCut(){};
// @Before(value = "pointCut()")
public void before(JoinPoint point)
{
Object target = point.getTarget();
System.out.println(target.toString());
String method = point.getSignature().getName();
System.out.println(method);
Class<?>[] classz = target.getClass().getInterfaces();
Class<?>[] parameterTypes = ((MethodSignature) point.getSignature())
.getMethod().getParameterTypes();
try {
Method m = classz[0].getMethod(method, parameterTypes);
System.out.println(m.getName());
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource data = m.getAnnotation(DataSource.class);
HandleDataSource.putDataSource(data.value());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.配置applicationContext.xml
<!-- 主库数据源 -->
<bean id="writeDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://172.22.14.6:3306/cpp?autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="partitionCount" value="4"/>
<property name="releaseHelperThreads" value="3"/>
<property name="acquireIncrement" value="2"/>
<property name="maxConnectionsPerPartition" value="40"/>
<property name="minConnectionsPerPartition" value="20"/>
<property name="idleMaxAgeInSeconds" value="60"/>
<property name="idleConnectionTestPeriodInSeconds" value="60"/>
<property name="poolAvailabilityThreshold" value="5"/>
</bean>
<!-- 从库数据源 -->
<bean id="readDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://172.22.14.7:3306/cpp?autoReconnect=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="partitionCount" value="4"/>
<property name="releaseHelperThreads" value="3"/>
<property name="acquireIncrement" value="2"/>
<property name="maxConnectionsPerPartition" value="40"/>
<property name="minConnectionsPerPartition" value="20"/>
<property name="idleMaxAgeInSeconds" value="60"/>
<property name="idleConnectionTestPeriodInSeconds" value="60"/>
<property name="poolAvailabilityThreshold" value="5"/>
</bean>
<!-- transaction manager, 事务管理 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 注解自动载入 -->
<context:annotation-config />
<!--enale component scanning (beware that this does not enable mapper scanning!)-->
<context:component-scan base-package="com.apc.cms.persistence.rdbms" />
<context:component-scan base-package="com.apc.cms.service">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Component" />
</context:component-scan>
<context:component-scan base-package="com.apc.cms.auth" />
<!-- enable transaction demarcation with annotations -->
<tx:annotation-driven />
<!-- define the SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.apc.cms.model.domain" />
</bean>
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.apc.cms.persistence" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
<bean id="dataSource" class="com.apc.cms.utils.ChooseDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<!-- write -->
<entry key="write" value-ref="writeDataSource"/>
<!-- read -->
<entry key="read" value-ref="readDataSource"/>
</map>
</property>
<property name="defaultTargetDataSource" ref="writeDataSource"/>
</bean>
<!-- 激活自动代理功能 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<!-- 配置数据库注解aop -->
<bean id="dataSourceAspect" class="com.apc.cms.utils.DataSourceAspect" />
<aop:config>
<aop:aspect id="c" ref="dataSourceAspect">
<aop:pointcut id="tx" expression="execution(* com.apc.cms.service..*.*(..))"/>
<aop:before pointcut-ref="tx" method="before"/>
</aop:aspect>
</aop:config>
<!-- 配置数据库注解aop -->
7.使用注解,动态选择数据源,分别走读库和写库。
@DataSource("write")
public void update(User user) {
userMapper.update(user);
}
@DataSource("read")
public Document getDocById(long id) {
return documentMapper.getById(id);
}
测试写操作:可以通过应用修改数据,修改主库数据,发现从库的数据被同步更新了,所以定义的write操作都是走的写库
测试读操作: 后台修改从库数据,查看主库的数据没有被修改,在应用页面中刷新,发现读的是从库的数据,说明读写分离ok。
遇到的问题总结:
问题1:项目是maven工程,用到了Spring aop机制,除了spring的核心jar包以为,还需要用到的jar包有aspectj.jar,aspectjweaver.jar,aopalliance.jar查看项目中的pom,发现缺少依赖包,由于本地仓库没有这些jar,查找可以提供下载jar包的maven中央库库,配置到maven中,自动更新:
<repository> <id>nexus</id> <name>nexus</name> <url>http://repository.sonatype.org/content/groups/public/</url> <layout>default</layout> </repository>
配置项目依赖的jar,主要是缺少这两个。
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
lt;/dependency>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# mysql读写分离
# aop
# 读写分离
# Spring AOP切面解决数据库读写分离实例详解
# SpringMVC4+MyBatis+SQL Server2014实现数据库读写分离
# SpringBoot集成Spring Data JPA及读写分离
# 详解Spring AOP 实现主从读写分离
# Spring+MyBatis实现数据库读写分离方案
# Spring配置动态数据源实现读写分离的方法
# Spring boot实现数据库读写分离的方法
# Spring 实现数据库读写分离的示例
# 使用Spring AOP实现MySQL数据库读写分离案例分析(附demo)
# Spring动态数据源实现读写分离详解
# 自己的
# 都是
# 是从
# 这两个
# 可以通过
# 还需要
# 配置文件
# 将把
# 大家多多
# 自动更新
# 主要是
# 同步更新
# 下次
# target
# service
# pointCut
# point
# getSignature
# method
# Class
相关文章:
建站之星安装模板失败:服务器环境不兼容?
制作网站的模板软件,网站怎么建设?
建站之星代理平台如何选择最佳方案?
在线教育网站制作平台,山西立德教育官网?
如何在IIS中新建站点并配置端口与IP地址?
淘宝制作网站有哪些,淘宝网官网主页?
建站之星安装提示数据库无法连接如何解决?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何通过可视化优化提升建站效果?
建站之星如何实现网站加密操作?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
如何快速建站并高效导出源代码?
建站之星安装后如何自定义网站颜色与字体?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
官网建站费用明细查询_企业建站套餐价格及收费标准指南
如何快速生成专业多端适配建站电话?
如何确保FTP站点访问权限与数据传输安全?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
Swift中swift中的switch 语句
网站制作说明怎么写,简述网页设计的流程并说明原因?
如何通过VPS建站无需域名直接访问?
如何在Tomcat中配置并部署网站项目?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
简单实现Android文件上传
Bpmn 2.0的XML文件怎么画流程图
如何选择香港主机高效搭建外贸独立站?
建站主机核心功能解析:服务器选择与网站搭建流程指南
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
网站微信制作软件,如何制作微信链接?
如何快速查询网站的真实建站时间?
网站网页制作专业公司,怎样制作自己的网页?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何用5美元大硬盘VPS安全高效搭建个人网站?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站企业制作流程,用什么语言做企业网站比较好?
如何通过网站建站时间优化SEO与用户体验?
网站按钮制作软件,如何实现网页中按钮的自动点击?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何零成本快速生成个人自助网站?
魔毅自助建站系统:模板定制与SEO优化一键生成指南
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何在Windows服务器上快速搭建网站?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
如何通过远程VPS快速搭建个人网站?
网站制作难吗安全吗,做一个网站需要多久时间?
*请认真填写需求信息,我们会在24小时内与您取得联系。