Linux 查看日志命令

Linux 查看日志命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
view  xxx.log    查看
Ctrl+B 上一页
Ctrl+F 下一页
G 定位到当前页最新一行
g 定位到当前页首页一行
可按 shift键 或者 CapsLock 切换一下 G g 命令

/xxx 向下搜索关键
?xxx 向上搜索关键字
n 查找下个关键字
N 向上查找关键字
实时日志 tail -f xxx.log
查找关键字 less xxx.log

在搜搜关键字所在日志文件时
grep 关键字 /path/*.log

常用保存命令

1
2
3
4
5
6
7
8
:w  保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
q: 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑

tail命令

1
2
3
4

tail -f xxx.log --- 实时查看xxx.log的日志

tail -n 100 xxx.log -----输出xxx.log 最新的100行

sed 命令

1
2
3
4
5
6
7
8
 输出某一段时间内的日志 
sed -n '/2021-10-18 08:00/,/2021-10-18 08:00/p' xxx/log

输出 某一段时间包含'xiaohu'的行数
sed -n '/2021-10-18 08:00/,/2021-10-18 19:00/p' xxx.log |grep -c "xiaohu"

将某一段时间的日志保存到一个新文件中
sed -n '/2021-10-18 08:00/,//p' xxx.log > newlog.log

追加

1
追加是 >> ,如果用 > 是覆盖

dubbo 常见问题

dubbo 常见问题

  • 案例1 消费者 多次调用 产生不同的结果

    可能原因

    ​ 1 . 多个不用Ip的生产者 生产者之前的版本不一致 。

    确认方案

    ​ 到Zookeeper可视化界面确认生产者 。

    解决方案 :统一版本 。

jvisualVM 使用笔记

  • 远程连接 注意 开放端口 和随机的两个端口

  • 查看cpu和内存分析

    如果是cpu 查看是否是有点代码 代码是否有while(true)

  • 如果是内存 查看是否大对象

Java泛型理解

Java 泛型理解

<? extends T> 表示 限定为 T类 及其子类

​ 有上限 为类 不能添加元素 (无法确定是哪个子类)能获取元素

<? super T> 表示 限定为 T类 及其父类

区别 有下限 为 T类 不能获取元素(无法确定哪个父类)

可以添加元素 因为<? super T>是T的某个父类,将子类T赋值给父类没任何问题

PECS ( Producer Extends Consumer Super )原则

  • 频繁往外读取内容的,适用于上界 Extends;
  • 经常往里插入的,适用于下界 Super。

参考博客

https://blog.csdn.net/qq_40074764/article/details/81514229

mvcc

MVCC 全称Multi-Version Concurrency Control 即 多版本并发控制。 MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
MVCC 在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式处理读-写 冲突 ,做到即使有读写冲突是,也能做到不加锁,非阻塞并发读。

快照读就是读取数据的时候会根据一定的规则读取事务可见版本的数据。
当前读 就是读取最新版本的数据 读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。

sellect *from ..where 语句为快照读。、、、

select *from …where …for update
select *from …where … in share mode
当前读。

如果事务中使用快照读,那么不会产生幻读现象,但是快照读和当前读混用就会产生幻读。

参考链接

https://www.jianshu.com/p/8845ddca3b23

事务失效场景

​ 事务失效场景

  1. 一个有@Transactional的方法被没有@Transactional方法调用时,会导致Transactional作用失效。也是最容易出现的情况。

    ​ 那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象管理

  2. 对非public方法进行事务注解。@Transactional 将会失效

原因:是应为在Spring AOP代理时,事务拦截器在目标方法前后进行拦截,DynamicAdvisedInterceptor的intercept 方法会获取Transactional注解的事务配置信息,

因为在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的 intercept 方法或 JdkDynamicAopProxy 的 invoke 方法会间接调用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法会间接调用 AbstractFallbackTransactionAttributeSourcecomputeTransactionAttribute 方法,这个方法会获取Transactional 注解的事务配置信息。他会首先校验事务方法的修饰符是不是public,不是 public则不会获取@Transactional 的属性配置信息。

  1. Transactional 事务配置属性中的propagation 属性配置的问题。

 当propagation属性配置为:

TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。       TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常

  1. 还存在一种情况

  在一个类中A方法被事务注释,B方法也被事务注释。

1
2
3
4
5
6
7
8
@Transactional
 public void A(){
  try{
  this.B();
  }catch(Exception e){
    logger.error();
  }
}

但在执行B方法是报错,但是异常被A catch 住,此时事务也会失效。

底层原理

其实原因很简单,Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。

spring事务的传播机制及原因分析;

propagation_required 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

@override有什么用,以及加不加@override有什么区别

@override有什么用,以及加不加@override有什么区别

1.简单来说@override注解是告诉编译器,下面的方法是重写父类的方法

2.如果不写@override注解去直接重写方法,编译器是不会判断你是不是正确重写了父类中的方法的。如重写方法时参数与父类不同,程序是不会提示报错的。这会留下一个潜在的bug。当你写了@override注解时,程序会判断你是否正确的重写了父类的对应方法。而且加上此注解后,程序会自动屏蔽父类的方法