@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DataSource { String value(); }
public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // TODO Auto-generated method stub return DynamicDataSourceHolder.getDataSouce(); } } public class DynamicDataSourceHolder { public static final ThreadLocal<String> holder = new ThreadLocal<String>(); public static void putDataSource(String name) { holder.set(name); } public static String getDataSouce() { return holder.get(); } }
public class DataSourceAspect { 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); DynamicDataSourceHolder.putDataSource(data.value()); System.out.println(data.value()); } } catch (Exception e) { // TODO: handle exception } } }
<bean id="masterdataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/shop" /> <property name="username" value="root" /> <property name="password" value="yangyanping0615" /> </bean> <bean id="slavedataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/test" /> <property name="username" value="root" /> <property name="password" value="yangyanping0615" /> </bean> <beans:bean id="dataSource" class="com.air.shop.common.db.DynamicDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <!-- write --> <entry key="master" value-ref="masterdataSource"/> <!-- read --> <entry key="slave" value-ref="slavedataSource"/> </map> </property> <property name="defaultTargetDataSource" ref="masterdataSource"/> </beans:bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 配置SqlSessionFactoryBean --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:config/mybatis-config.xml" /> </bean>
<!-- 配置数据库注解aop --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> <beans:bean id="manyDataSourceAspect" class="com.air.shop.proxy.DataSourceAspect" /> <aop:config> <aop:aspect id="c" ref="manyDataSourceAspect"> <aop:pointcut id="tx" expression="execution(* com.air.shop.mapper.*.*(..))"/> <aop:before pointcut-ref="tx" method="before"/> </aop:aspect> </aop:config> <!-- 配置数据库注解aop -->
public interface UserMapper { @DataSource("master") public void add(User user); @DataSource("master") public void update(User user); @DataSource("master") public void delete(int id); @DataSource("slave") public User loadbyid(int id); @DataSource("master") public User loadbyname(String name); @DataSource("slave") public List<User> list(); }
相关推荐
要实现Spring AOP的多数据库读写分离,我们需要以下步骤: 1. **配置数据源**:首先,我们需要配置多个数据源,一个作为主库(处理写操作),另一个或多个作为从库(处理读操作)。这可以通过Spring的`...
本篇文档将详细探讨如何利用Spring框架实现数据库的读写分离,并结合MySQL的主从复制机制,确保系统的稳定运行和高效响应。 ### 背景分析 在实际应用中,许多系统面临着数据读取压力远大于写入压力的情况,这导致...
读写分离就是对于一条SQL该选择哪一个数据库去执行,至于谁来做选择数据库这件事,有两个,要么使用中间件帮我们做,要么程序自己做。一般来说,读写分离有两种实现方式。第一种是依靠中间件MyCat,也就是说应用程序...
在应用层解决数据库读写分离可以通过Spring框架来实现,本文将介绍如何使用Spring解决数据库读写分离。 概念 * 读写分离:将数据库的读取和写入操作分开处理,以提高数据库的性能和可用性。 * 主从复制:将主...
通过以上分析,我们可以看出,Spring、Spring MVC、MyBatis和MySQL的组合,为实现数据库读写分离提供了一种高效且灵活的解决方案。理解并掌握这些知识点,对于提升系统的稳定性和性能具有重要的意义。
在数据库读写分离的场景下,Spring可以通过配置不同的数据源,实现对主从库的管理和切换。例如,通过`@Qualifier`注解来指定使用哪个数据源,或者利用AOP在特定方法上动态切换。 3. **MyBatis**:MyBatis是一个优秀...
本项目将这些框架进行了整合,并进行了数据库读写分离的配置,以提高系统的稳定性和性能。 首先,Spring框架作为基础,提供了强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented ...
在现代Web应用开发中,数据库读写分离和缓存技术是提高...通过以上组件的整合,项目能够实现高效、稳定的数据库读写分离和缓存策略,从而提高系统的响应速度和并发处理能力。同时,这种架构也便于后期的维护和扩展。
Spring框架提供了对MySQL数据库读写分离的良好支持,使得开发者能够轻松地在应用中实现这一功能。 **1. 什么是读写分离** 读写分离是指在数据库系统中,将读操作和写操作分配到不同的服务器上执行,读操作通常发生...
本示例"Spring+MySQL+MyBatis+SpringMVC 读写分离"是针对这种策略的一个实现,旨在帮助开发者理解如何在实际项目中应用这一技术。下面将详细介绍这个Demo中的关键知识点。 首先,我们要理解什么是读写分离。读写...
通过以上步骤,你就可以在应用层利用Spring的特性实现数据库读写分离了。在实际项目中,还需要考虑其他的因素,如数据同步(如MySQL的binlog同步)、故障转移、负载均衡等。同时,合理地设计读写策略,避免在高并发...
在MySQL的读写分离场景中,通常我们会设置一个主数据库处理写操作,多个从数据库处理读操作。这样可以减轻主数据库的压力,提高读取效率。实现这个功能的关键在于智能地决定数据请求应该路由到哪个数据库。这就是AOP...
本文将深入探讨如何利用Spring AOP(面向切面编程)实现应用层的MySQL读写分离,并结合一主多从的配置来进行详细讲解。 首先,我们需要理解MySQL的主从复制机制。在主从复制中,数据的写操作(INSERT、UPDATE、...
通过本文介绍,我们了解了如何在 Spring Boot 中集成 Sharding-JDBC 来实现数据库的读写分离。这种方式不仅简化了开发流程,还大大提高了系统的可扩展性和可用性。对于处理大规模数据的应用来说,这种方案是非常实用...
这个项目为学习和理解SSM(Spring、SpringMVC、MyBatis)整合以及数据库读写分离提供了一个实际的实践平台。通过深入研究和实践这个项目,开发者可以更好地掌握这些技术,并应用到自己的项目中,提升系统的性能和...
Sharding-JDBC可以与Spring Boot进行整合,以实现数据库分库分表和读写分离。 四、Sharding-JDBC的配置 Sharding-JDBC的配置主要通过.properties文件或.yaml文件实现。在.properties文件中,我们可以设置数据库的...
总之,这个"数据库读写分离demo"展示了如何在Java应用中,利用MyBatis和AOP技术来实现数据库读写分离,提高系统的读写性能和稳定性。通过这种方式,我们可以在不影响原有代码结构的前提下,优雅地解决高并发场景下的...
最近项目要支持读写分离, 网上找了很多,但都是不太完整,我自己整理了下供大家参考。 我的项目使用的框架: springMvc+spring+hibernate+springJPA+maven, 数据库连接池用阿里的druid。
Spring Boot是流行的Java开发框架,提供了便捷的方式来配置和使用数据库,包括实现数据库读写分离。 1. **MySQL主从复制原理**: 主从复制的核心是binlog(二进制日志),主节点的所有更改操作都会记录在binlog中...