String d1="2022-5-16 12:00:00";
String d2="2022-5-16 13:00:00";
int b=d1.compareTo(d2)
System.out.println(b)//-1
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2022-5-16 15:16:30");
Date date2 = format.parse("2022-5-16 15:15:30");
int j = date.compareTo(date2);//-1
System.out.println(j);
LocalDateTime t = LocalDateTime.now();
LocalDateTime tt=LocalDateTime.now();
int k = t.compareTo(tt);
System.out.println(k) //0
System.out.println(t.isBefore(tt)); //false
System.out.println(t.isAfter(tt)); //false
System.out.println(t.isEqual(tt)); //true
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date t1 = sdf.parse("2022-5-16 14:41:30");
Date t2=sdf.parse("2022-5-16 14:50:00");
System.out.println(t1.before(t2)); //false
System.out.println(t1.after(t2)); //true
变量可见性是发生在多线程,是指当共享变量的值发生改变时,其他线程可以直接获取到变量的最新值。
而volatile的变量可见性则会保证volatile修饰的变量读写跳过CPU高速缓存这一步,即CPU1执行完毕后会将i的值直接更新到主存中,而CPU2取i的值时则直接从主存中取。如此就解决了上面两个线程串行执行,结果依然不是期望值的问题。
但是这并不意味着volatile修饰后的i就能保证i=i+1的执行同步了。多线程同时对i进行计算依然会存在同步问题,这是因为i=i+1这一计算过程分为三步:
1.拿到i的值
2.i和1执行加算
3.将计算出来的值赋值到i中
volatile修饰后变量i只是保证第一步拿到i的值总是最新的,以及第三步i更新后总是能及时更新主存中以供其他线程获取最新值。但是却不能保证两个线程串行执行。因此要想保证i=i+1计算的同步依然需要更重的synchronized来实现。
【JAVA核心知识】16:volatile关键字:变量可见性与禁止重排序_yue_hu的博客-CSDN博客_java 禁止重排序
1.所生成的ID按时间递增
2.整个分布式系统不会有重复的ID
缺点:该算法依赖于时间,倘若服务器发生时钟回拨会导致id重复。
时间戳:表示某一刻的时间什么是时间戳?时间戳有什么用?(适合新人)_莫参商的博客-CSDN博客_时间戳是什么意思
总是假设最坏的结果,每次拿数据都会被认为会修改,所以每次再拿数据的时候都会上锁(共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源让给其他线程)
总是假设最好的结果,每次拿数据都认为不会被修改,所以每次在拿数据的时候都不会上锁,但在更新的时候会判断在此期间有没有人更新数据。乐观锁适用于多读的应用类型,这样可以提高吞吐量。
程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3、代码中存在死循环或循环产生过多重复的对象实体;
4、使用的第三方软件中的BUG;
5、启动参数内存值设定的过小;
SpringBoot解决跨域问题的六种方式_程世玉的博客-CSDN博客_springboot跨域问题怎么解决
@RequestBody的使用_justry_deng的博客-CSDN博客_@requestbody
给客户端响应cookie_violet_evgr的博客-CSDN博客_响应cookie
部署一个项目的步骤_CC鹿的博客-CSDN博客_如何部署一个项目
1、having先分组后计算,where反之。
2、having后面可以跟聚合函数,where不可以。
1、where ···(只能对分组前的属性进行筛选)
2、having ···(只能对分组后的每个组的整体属性进行筛选,用聚合函数体现)
(1)读未提交(read Uncommited)
在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读的问题,安全性太差。
(2)读已提交(read commited)
ORACLE默认隔离级别,有幻读以及不可重复读风险。
(3)可重复读(Repeatable read)
MySQL的默认隔离级别,解决不可重复读的隔离级别,但还是有幻读风险。
(4)可串行化(serializable)
最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了。
索引为了加快查询速度的一种数据结构
创建索引时,限制索引的字段值必须是唯一的
B+树是B树的一种变体,属于平衡多路查找树,包含根节点、内部节点和叶子节点。多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率。另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找。
ORM(对象关系映射) 是在关系型数据库和业务实体对象之间做一个映射,在操作业务对象时,不需要和复杂sql打交道 只需简单的操作对象的属性和方法。
resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
是一种数据库攻击手段,sql数据库的操作是通过sql语句来执行的,在数据项中加入某些sql语句关键字(select drop)就可能会在数据库写入或读取时得到执行。
@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View.
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户。
过滤器基于回调函数实现
拦截器基于java反射机制实现
过滤器:是基于servlet规范,需实现Filter接口,依赖于tomcat容器
拦截器:是String的组件,由String容器管理
过滤器:在请求servlet前后处理
拦截器:对请求在Handler前后处理
过滤器:通过注解Order实现,值越小优先级越高
拦截器:通过order方法实现
实现feign.RequestInterceptor接口。
重写方法apply(RequestTemplate template)。
设置header属性:template.header(name,value)
设置param属性:template.query(name,value)
抽象mina和netty为统一接口,以Message为中心
dubbo底层使用netty这样的NIO框架,基于tcp协议传输,配合Hession序列化完成rpc通信。
是服务实现服务化管理的核心组件,提供了服务治理的功能,实现了服务的自动注册与发现,是微服务中不可或缺的一部分,减少了维护人员频繁且大量的修改配置信息。
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。
什么是分布式锁? 为啥需要分布式锁?_LXH-404的博客-CSDN博客_为什么要用分布式锁
进行统一的鉴权,如果在为服务中不使用网关,每个服务都需要进行鉴权,增加了系统的复杂性同时也影响了用户的体验。
网关鉴权可以有效的保护微服务,只暴露自己的地址,其他服务可以通过内网的防火墙保护。
易于监控,将监控数据推送到外部系统进行分析。
统一接入:请求路由、灰度发布、请求过滤、版本控制、监控服务的性能。
流量监控:可以限流防止系统崩溃、流量错峰、服务降级。
安全防护:服务保护及鉴权,意味着只有授权的系统才能访问;可以设置黑白名单,内外网隔离。
安装pcre(是基于c语言编写的正则表达式函数库)
安装openssl、zlib、gcc 依赖
安装Nginx:
修改Nginx配置(配置监控端口、配置服务器集群、配置URL匹配路径)修改完重启。
安装keepalived保证高可用(修改配置文件、编写脚本,并将该文件放到/usr/local/src/中)
nginx配置高可用集群 - 知乎