前言首先想一个问题:在高并发场景下,数据库有哪些优化方式?常用的实现方式有以下几种:读写分离、加缓存、主从架构集群、分库分表等。在互联网应用中,大多是读多写少的场景。设置了两个库,主库和读库。主库负责写,从库主要负责读。可以建立读库集群,减少读写冲突,减轻数据库负载,通过隔离数据源上的读写功能来保护数据库。实际使用中凡是涉及写的部分直接切换到主库,涉及到读的部分直接切换到读库。这是典型的读写分离技术。这篇博文将重点关注读写分离,并讨论如何实现它。图片主从同步的局限性:这里分为主库和从库。主库和从库保持相同的数据库结构。主库负责写入。写入数据时,会自动同步数据到从库;从库负责读,当有读请求到来时,直接从读库中读取数据,主库会自动将数据复制到从库。不过本篇博客不介绍这部分配置的知识,因为更多的是运维方面的工作。这里涉及到一个问题:主从复制的延迟问题。在写master数据库的时候突然进来一个读请求,这个时候数据还没有完全同步,读请求的数据读不到或者读到的数据小于原来的值。最简单的具体方案就是把读请求暂时指向主库,但同时也失去了一部分主从分离的意义。也就是说,在严格意义上的数据一致性场景下,读写分离并不完全适用。注意更新的及时性是读写分离的缺点。好吧,这部分只是为了理解。接下来看看如何通过java代码实现读写分离:项目需要引入如下依赖:springBoot、spring-aop、spring-jdbc、aspectjweaver等:主从数据源配置我们需要配置主从数据库,主从数据库的配置一般写在配置文件中。通过@ConfigurationProperties注解,可以将配置文件(一般命名为:application.Properties)中的属性映射到具体的类属性,从而读取写入的值注入到具体的代码配置中。按照习惯,大于约定的原则,我们总是把主库标为master,从库标为slave。本项目使用阿里的druid数据库连接池,使用构建器模式创建DataSource对象。DataSource是代码层面抽象出来的数据源,接下来需要配置sessionFactory、sqlTemplate、事务管理器等/***主从配置**@authorwyq*/@Configuration@MapperScan(basePackages="com.wyq.mysqlreadwriteseparate.mapper",sqlSessionTemplateRef="sqlTemplate")publicclassDataSourceConfig{/***主库*/@Bean@ConfigurationProperties(prefix="spring.datasource.master")publicDataSourcemaster(){returnDruidDataSourceBuilder.create().build();}/***来自图书馆*/@Bean@ConfigurationProperties(prefix="spring.datasource.slave")publicDataSourceslaver(){returnDruidDataSourceBuilder.create()。build();}/***实例化数据源路由*/@BeanpublicDataSourceRouterdynamicDB(@Qualifier("master")DataSourcemasterDataSource,@Autowired(required=false)@Qualifier("slaver")DataSourceslaveDataSource){DataSourceRouterdynamicDataSource=newDataSourceRouter();Map