欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常见问题1

程序员文章站 2022-03-25 21:27:20
...

*** 索引失效情况

1 字段添加函数、计算操作
2 数字隐式转换 如varchar不加单引号的话可能会自动转换为int型
3 不等查询
4 当全表扫描用时少于索引用时[一般查询数据大于总量的30%的时候就会不走索引了]
5 like 以%开头
6 联合索引没有遵循最左原则
7 or 联合查询字段没有全部建立索引
8 在索引列上使用 IS NULL 或 IS NOT NULL操作

*** 事务传播情况

1 PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

2 PROPAGATION_SUPPORTS 如果存在一个事务,则支持当前事务。如果没有事务则以非事务运行。

3 PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

4 PROPAGATION_REQUIRES_NEW 它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。

5 PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

6 PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常。

7 PROPAGATION_NESTED 外层事务失败会回滚内外层所有事务 内层事务失败即PROPAGATION_NESTED 事务失败 则只回滚内层事务
如果单独调用PROPAGATION_NESTED 方法,则按REQUIRED 第一种事务传播方式 执行

*** 事务不受控制情况

编程式事务 在代码中显式的编写事务代码 缺点代码侵入严重

声明式事务 spring注解

1 如果你的数据库引擎不支持事务,再怎么使用事务注解也是没用的,就像MySQL的MyISAM引擎是没有事务的。

2 没有被spring管理的类 即使方法中使用了事务注解@Transactional 也是不被控制的

3 方法不是public的 因为jdk代理和cglib代理都无法代理private 方法 可以开启 AspectJ 代理模式

*** springboot常用注解

@springbootApplication
@Configuration
@EnableAutoConfiguration
@ComponentScan

*** select count(*) 和 select count(字段) 区别

count(字段) 不包含NULL

count(*)

  • MYISAM mysql进行了优化效率很高 MyISAM做了一个简单的优化,把表的总行数单独记录下来,
    如果执行count(*)时可以直接返回,前提是不能有where条件。MyISAM是表级锁,不会有并发的行操作,所以查到的结果是准确的。
  • InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,
    而非聚簇索引的叶子节点中保存的是该行记录的主键的值。MySQL会优先选择最小的非聚簇索引来扫表。
  • COUNT(1) 和 count(*) 优化是一样的

*** IO多路复用

*** JVM垃圾回收器都有哪些

  • 判断对象是否为垃圾的算法:a> 引用计数 b> 可达分析

  • 垃圾回收算法:a> 标记清除 b> 复制算法 c> 标记整理 d> 分代收集

  • 垃圾回收器:

-------------------------------↓↓↓↓以上为新生代回收器↓↓↓↓----------------------------------------

a> serial收集器 最基本发展时间最长 单线程 工作时其他全部运行代码停止

b> ParNew收集器 是serial收集器的多线程版本 工作时其他全部运行代码停止

c> Parallel Scavenge 收集器 自动调节内存参数 达到吞吐量的最优

-------------------------------↑↑↑↑以上为新生代回收器↑↑↑↑----------------------------------------

-------------------------------↓↓↓↓以上为新生代回收器↓↓↓↓----------------------------------------

d> Serial Old 收集器 单线程 工作在老年代


e> Parallel Old 收集器

f> CMS收集器 基于标记-清除算法实现。并发收集、低停顿。

-------------------------------↑↑↑↑以上为新生代回收器↑↑↑↑----------------------------------------

g> G1收集器

	g.1> G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间
	
	g.2> 其他收集器的工作范围是整个新生代或者老年代、G1收集器的工作范围是整个Java堆

*** JVM 内存模型

  • 程序计数器 线程私有 每个线程都有会有个程序计数器内存 记录着当前要执行的代码行号
  • 栈 每个方法在执行的时候也会创建一个栈帧,存储每个方法的局部变量 方法返回地址等
  • 堆 被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例
  • 方法区 被所有方法线程共享的一块内存区域。用于存储已经被虚拟机加载的类信息,常量,静态变量等。
  • 本地方法栈 线程私有 存放本地方法

*** mybatis ${}和#{}的区别

  • ${}是字符串拼接,不但’’ 条件查询时 字符串类型 需要手动拼接’'没有sql预编译 可以sql注入

  • #{}是占位符,自动添加’’ 执行语句经过预编译 可以防止sql注入

  • 查询语句表名为参数时和 order by字段为参数时 必须用${}传递

  • 不论是单个参数,还是多个参数,一律都建议使用注解@Param("")

*** redis 数据类型

string list set hash sort

*** 线程同步的几种方法

  • synchronized、volatile、原子类【CAS】、lock、容器类、【concurrentHashmap】、ThreadLocal

  • synchronized 锁升级
    1 无锁 锁对象初始化时 是无锁状态
    2 偏向锁 只有一个线程执行加锁代码 此时当前加锁对象的mark world中存储为偏向锁信息
    3 轻量级锁 多个线程执行加锁代码 但在每个线程执行加锁代码时 从没有发生过竞争 导致另一个线程自旋
    4 重量级锁 多个线程执行加锁代码 并出现线程自旋超时 就会升级为重量级锁

    锁只会自动升级 不会也不能降级

  • volatile 保证内存可见性 但不能保证原子性,保证指令重排序的一致性

  • 原子类 AtomicInteger等底层原理为 CAS 原子类会有ABA问题 可以用AtomicStampedReference 解决

  • 如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)。
    使用AtomicLong时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS会成功,
    所以其他线程会不断尝试自旋尝试CAS操作,这会浪费不少的CPU资源。而LongAdder可以概括成这样:内部核心数据value分离成一个数组(Cell),
    每个线程访问时,通过哈希等算法映射到其中一个数字进行计数,而最终的计数结果,则为这个数组的求和累加。简单来说就是将一个值分散成多个值,
    在并发的时候就可以分散压力,性能有所提高。