Spring下MySQL读写分离
引言之前的文章已经说明MySQL主从/主主同步环境的搭建,接下来就是要实现在业务代码里面实现读写分离。在当前流行的SSM的框架开发的web项目下,数据库模式为主从同步的环境下编写业务代码。
编写jdbc.propreties在这里指定了两个数据库,主从数据库都在本地,只是端口不一致。
1234567891011121314#数据库连接池的配置jdbc.pool.init=1jdbc.pool.minIdle=3jdbc.pool.maxActive=20#mysql驱动jdbc.driver=com.mysql.jdbc.Driver#主数据库地址jdbc.master.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true#从数据库地址jdbc.slave.url=jdbc:mysql://127.0.0.1:3308/test?useUnicode=true&characterEncoding=utf-8&a ...
MySQL执行计划
引言MySQL执行计划,简单的来说,是SQL在数据库中执行时的表现情况,通常用于SQL性能分析,优化等场景。在MySQL使用 explain 关键字来查看SQL的执行计划。
适用场景适用于 select、update、insert、replace、delete语句,在需要分析的语句前加EXPLAIN,即可。
EXPLAIN可得到的信息
SQL如何使用索引
关联查询的执行顺序
查询扫描的数据行数
读懂执行计划例如以下关联查询:
1EXPLAIN SELECT * FROM tb_item JOIN tb_item_desc ON tb_item.id=tb_item_desc.item_id WHERE id='679533';
根据上图可得到执行计划的列信息,下面分析一下每列所表示的信息。
## ID
ID列中的数据为一组数字,表示执行Select语句的顺序。
ID值相同时,执行顺序由上至下。
ID值越大优先级越高,越先被执行。
SELECT_TYPE表示查询中每个Select子句的类型(简单 OR 复杂)。
SIMPLE:不包含子查询或是UNION操作 ...
MySQL主从/主主复制
引言MySQL作为世界上最广泛的数据库之一,免费是原因之一,其本身功能的强大也是获得众多用的青睐的重要原因。在实际的生产环境中,单机版MySQL数据库就不能满足实际的需求了,此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器。在此之前必须要保证每台MySQL服务器里的数据同步。数据同步可以通过MySQL内部配置就可以轻松完成,主要有主从复制和主主复制。
在本案例下使用同一台机器安装两个数据库,只是端口不一致,一个为3306,一个为3308。
复制原理
Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events) 。
Slave通过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log) 。
Slave重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。
复制类型 1、基于语句的复制(st ...
Redis数据过期策略
引言Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制。为了防止一次性清理大量过期Key导致Redis服务受影响,Redis只在空闲时清理过期Key。
Redis过期时间设置过期时间redis有四种命令可以用于设置键的生存时间和过期时间:
1234EXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 秒PEXPIRE <KEY> <TTL> : 将键的生存时间设为 ttl 毫秒EXPIREAT <KEY> <timestamp> : 将键的过期时间设为 timestamp 所指定的秒数时间戳PEXPIREAT <KEY> <timestamp>: 将键的过期时间设为 timestamp 所指定的毫秒数时间戳.
返回值
一个整数值1或0,如下:
如果成功地为该键设置了超时时间,返回 1
如果键不存在或无法设置超时时间,返回 0
保存过期时间redis中key的过期时间和生存时间保存方式:在数据库结构redisDb中的expires字典中保 ...
Spring之动态代理
引言Spring主要有两大思想,一个是AOP,一个是IOC。对于Spring的核心AOP来说,动态代理机制是其核心,想要明白AOP原理,一定要了解动态代理机制。
代理模式
给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即操作者不直接操控原对象,而是通过代理对象简介地操控原对象。
实现代理模式分为静态代理和动态代理:
静态代理:代理类是在编译时就实现好。也就是说 Java 编译完成后代理类是一个实际的 class 文件。
动态代理:动态代理类的字节码是在程序运行时由Java反射机制动态生成。也就是说 Java 编译完之后并没有实际的 class 文件,而是在运行时动态生成的类字节码,并加载到JVM中。
Spring静态代理
由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
静态代理之前已经说过 Spring-AOP两种配置方式
Spring动态代理JDK动态代理(对有实现接口的对象做代理)
实现方式说明JDK动态代理中 需要了解的两个重要的类或接口 [Invo ...
Apache-Commons-Email发送邮件
引言使用Apache-Commons-Email发送邮件
环境准备Maven的pom.xml 文件中引入依赖
12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.5</version></dependency>
一个简单的纯文本邮件HTTP模式下第一个例子是创建一个简单的email。
123456789101112131415161718192021222324252627282930313233343536373839import org.apache.commons.mail.EmailException;import org.apache.commons.mail.SimpleEmail;/*** 类名: TestSimpleEmail.java <br/>* 详细描述: 一个简单的纯文本邮件 ...
Mybatis之缓存
引言Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多缓存1024条SQL。二级缓存是指可以跨SqlSession的缓存。
Mybatis缓存缓存的意义:将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
Mybatis提供一级缓存和二级缓存
mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据。
二级缓存是跨sqlSession,是mapper级别的缓存,对于mapper级别的缓存不同的sqlsession是可以共享的。
Mybatis一级缓存Mybatis的一级缓存原理:
第一次发出一个查询sql,sql查询结果写入sqlsession的一级缓存中,缓存使用的数据结构是一个map<key,value> ...
线程池之ThreadPoolExecutor
引言JAVA对于多线程的封装非常丰富,提供了多种适用于不同场景的多并发实现。但如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。这里就引入了线程池来管理线程,其中最基础、最核心的线程池要属ThreadPoolExecutor类了。
Java中的ThreadPoolExecutor类java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。
在ThreadPoolExecutor类中提供了四个构造方法:
123456789101112131415161718192021public class ThreadPoolExecutor extends AbstractExecutorService { ..... public ThreadPoolExecutor(int corePoolSize,int ...
