java随笔

119 阅读2分钟

随笔记

  threadlocal的正确用法
  1.每次调用完后,调用remove方法进行清空
  2.使用private static强引用类型,避免threadlocalmap的key为null的时候存在引用链,造成内存泄漏
    (每个threadlocal对象内有一个threadlocalmap,key为threadlocal,value为其对象)
  
  rabbitmq消息确认机制
  1.生产者端:信道上开启确认模式,broker在接收到消息后会返回ack给生产者,生产者会进行应答接收,来
  反馈是否接收到该信息,然后调用对应的handleack和handlenack来处理重发或者其他逻辑
  2.消费者端:接收到消息后也会返回ack给borker,如果收到ack消息将剔除mq中的消息,如果由于消费者
  断开或消息处理超时没有收到ack将会进行重新投递,可能会造成重复消费,需要保证接口幂等性
  
  rabbitmq的死信队列和延时队列
  当消息超时后会进入私信交换机绑定的死信队列,只需要在使用队列的时候指定其绑定的死信交换机
  延时队列是在其基础上的用法,即设置ttl过期时间,可以设置在消息或者队列上,然后让消费者监听对应的
  死信队列就可以实现延时队列
  
  currentHashMap采用分段锁 
  数据结构:reentrantlock+segment+hashentery,一个segement中包含一个hashentery数组
  元素查询采用二次hash,一次定位到segement,第二次hash定位到对应的链表
  锁:segement继承了retranlock,锁定操作的segement,其他segement不受影响,数组扩容不会影
  响segement,get方法无需加锁
  
  @transactional注解
  propagation来控制事务的传播行为,常用的是required(如果当前存在事务则加入,如果不存在则创建
  )和required_new(新建一个事务,如果当前存在事务就将事务挂起)
  事务失效:自调用没用使用代理对象,该类没有被spring容器管理,异常被吃掉,数据库引擎不支持事务
  ,注解的方法不是public
  
  慢查询优化:
  测试环境来查看sql耗时以及执行计划,一般为未命中索引导致,或者查询了大量不需要的列可以进行一定程
  度的sql优化,执行计划看type字段一般是:system >constant>eq_ref>ref>orange>index>all
  system:数据库中只有一条数据
  constant:通过主键或者唯一索引命中一条数据直接返回
  eq_ref:读取本表和关联表中的每行组合成一行返回
  ref:普通索引可能命中多行
  orange:常见于betweenin中扫描了部分索引
  index:扫描了全部索引
  all:扫描全表
  
  nginx做反向代理和负载均衡
  upstream:默认为轮询,可设置权重,iphash,最少连接或响应时间最短来设置