随笔分类 - 技术杂说
摘要:下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。 INNER JOIN(内连接) 在表中存在至少一个匹配时,INNER JOIN 关键字返回行(并集)。 注意:INNER JOIN 与 JOIN 是相同的。 SELECT <sel
阅读全文
摘要:MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,而InnoDB支持行锁和表锁。 如何加锁? MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给
阅读全文
摘要:每次谈到数据库的事务隔离级别,大家一定会看到这张表。 经常看到RR(可重复读)级别是可以重复读的,但是无法解决幻读,只有可串行化(Serializable)才能解决幻读,这个说法是否正确呢? 假设我们的数据库中有如下结构和数据的Users表,下文中我们将对这张表进行操作 什么是幻读 在说幻读之前,我
阅读全文
摘要:MySQL是一个开放源码的关系数据库管理系统,目前为Oracle旗下产品。被甲骨文公司收购后,MySQL的创始人麦克尔·维德纽斯以MySQL为基础,成立分支计划MariaDB。原先一些使用MySQL的开源软件,部分转向了MariaDB或其它的数据库。不可否认的是,MySQL由于其性能高、成本低、可靠
阅读全文
摘要:MySQL中myisam与innodb的区别 MyISAM: 不支持事务,但是每次查询都是原子的; 支持表级锁,即每次操作对整个表加锁; 存储表的总行数; 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件; 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,
阅读全文
摘要:选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。 为经常需要排序、分组和联合操作的字段建立索引 经常需要ORDER BY、GR
阅读全文
摘要:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁 上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺
阅读全文
摘要:判断一个整数是否是奇数: public boolean isOdd(int i) 很多人都会这样写: public boolean isOdd(int i) { if (i % 2 == 1) { return true; } else { return false; } } 优化以下: publi
阅读全文
摘要:随着时间和业务的发展,数据库中表的数据量会越来越大,相应地,数据操作,增删改查的开销也会越来越大。因此,把其中一些大表进行拆分到多个数据库中的多张表中。 本篇文章是基于非事务消息的异步确保的方式来完成分库分表中的事务问题。 需要解决的问题 原有事务 由于分库分表之后,新表在另外一个数据库中,如何保证
阅读全文
摘要:BeanFactory和FactoryBean的区别 BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。 ApplicationContext由BeanFactory接口派生而来,包含BeanFactory的所有功能。 FactoryBean也是接口,为
阅读全文
摘要:多线程技术是服务端开发人员必须掌握的技术。线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。在Java中有一个Executors工具类,可以为我们创建一个线程池,其本质就是new了一个ThreadPoolExecutor对象。 线程池创建 先看一
阅读全文
摘要:#{}和${}的区别是什么? 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。 #{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执
阅读全文
摘要:TCP 要说http就绕不开tcp,TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性。但是,http是基于tcp协议的。 TCP/IP 协议分层模型 物理层将二进制的0、1和电压高低,光的闪灭和电波的强弱信号进行转换 链路层代表驱动 网络层 使用 IP 协议,IP 协
阅读全文
摘要:当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化三个步骤对该类进行类加载。 类的加载、链接和初始化 类的加载 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象。类的加载过程是由类加载器来完成,类加载器由JVM提供。我们开发人员
阅读全文
摘要:停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。 在java中有以下3种方法可以终止正在运行的线程: ① 使线程正常退出,也就是当run方法完成后线程终止。 ② 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方
阅读全文
摘要:线程之间通信的方式: ① 同步 ② while轮询的方式 ③ wait/notify机制 ④ 管道通信 同步 多个线程通过synchronized关键字持有同一个对象实现线程间的通信。本质上就是“共享内存”式的通信。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 whi
阅读全文
摘要:为什么要拆分数据库? 取决于数据库的负载和数据量。 单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统、文书系统、ERP系统、OA系统,用一个MySQL数据库实例基本就够用了。 就像《淘宝技术这十年》里面说到的,电商业务的数据量增长飞快,所以最开始的PHP+MyS
阅读全文
摘要:联合索引失效的条件 联合索引又叫复合索引或组合索引。两个或更多个列上的索引被称作复合索引。 对于复合索引:MySQL从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。例如索引是key index (a,b,c)。可以支持a | a,b | a,b,c 3种组合进行查找
阅读全文
摘要:Redis字符串的实现 Redis虽然是用C语言写的,但却没有直接用C语言的字符串,而是自己实现了一套字符串。目的就是为了提升速度,提升性能,可以看出Redis为了高性能也是煞费苦心。Redis构建了一个叫做简单动态字符串(Simple Dynamic String),简称SDS。 SDS 代码结构
阅读全文
摘要:哈希表(hash table)也叫散列表,是一种非常重要的数据结构,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表。 本文是基于JDK1.7的源码进行讲解,JDK8会有所不同,大致的变化: 1.7中采用数组+链表,1.8采用的是数组+链表/红黑树,即在1.7中链表长度
阅读全文