美文网首页
JAVA互联网架构-spring结合mybatis实现数据库读写

JAVA互联网架构-spring结合mybatis实现数据库读写

作者: java小码哥 | 来源:发表于2017-09-17 19:18 被阅读0次

    随着系统用户访问量的不断增加,数据库的频繁访问将成为我们系统的一大瓶颈之一。由于项目前期用户量不大,我们实现单一的数据库就能完成。但是后期单一的数据库根本无法支撑庞大的项目去访问数据库,那么如何解决这个问题呢?

    实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。

    采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性。我们看下采用读写分离的背景。

    本人在项目开发初期的时候就设计了一个简单的读写分离,现在我把demo分享给大家。

    采用技术Spring + mybatis

    首先定义一个annotation

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Target;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    @Retention(RetentionPolicy.RUNTIME)

    @Target(ElementType.METHOD)

    public @interface DataSource {

    public String value();

    }

    再定义一个HandleDataSource

    public class HandleDataSource {

    public static final ThreadLocal holder = new ThreadLocal();

    public static void putDataSource(String datasource) {

    holder.set(datasource);

    }

    public static String getDataSource() {

    return holder.get();

    }

    }

    定义一个切面

    import java.lang.reflect.Method;

    import org.aspectj.lang.JoinPoint;

    import org.aspectj.lang.reflect.MethodSignature;

    public class DataSourceAspect {

    public void pointCut() {

    };

    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);

    HandleDataSource.putDataSource(data.value());

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    获取数据源

    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

    public class ChooseDataSource extends AbstractRoutingDataSource {

    protected Object determineCurrentLookupKey() {

    return HandleDataSource.getDataSource();

    }

    }

    配置XMl

    classpath*:mysql.propertiescom.mysql.jdbc.Driver${jdbc.url}${jdbc.user}${jdbc.password}SELECT 1 FROM DUAL32510010000true60com.mysql.jdbc.Driver${jdbc.url.read}${jdbc.user.read}${jdbc.password.read}SELECT 1 FROM DUAL32510010000true60

    注解到service接口上面

    总结

    1、多写多敲代码,好的代码与扎实的基础知识一定是实践出来的

    2、可以去百度搜索腾讯课堂图灵学院的直播课程来学习一下java架构实战案例,还挺不错的。

    3丶Java开发/架构交流群:658706010我们一起讨论技术,一起充电跟比你厉害的人在一起进步会更快哦

    最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起

    相关文章

      网友评论

          本文标题:JAVA互联网架构-spring结合mybatis实现数据库读写

          本文链接:https://www.haomeiwen.com/subject/gysmsxtx.html