自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(220)
  • 收藏
  • 关注

原创 CPU iowait是什么意思

举个例子,当服务器要访问网络文件系统(比如storage server通过NFS方式让客户端访问),由于网络的问题或者远端server性能问题导致响应慢,而当前服务器又有大量进程、线程要访问这个远端文件系统,当这些进程、线程在某个时刻都处于等待IO的状态,这是这个CPU时间片就会被统计到iowait中。我们直到,在cpu运行进程、线程时,遇到IO操作,因为IO读写通常比较慢,CPU通常可以阻塞线程,转去执行其他线程,做其他事情。等IO完成之后,通过中断,再通知CPU继续执行之前的线程。

2024-03-03 17:13:49 293

原创 git底层原理之各种refs(引用,指针)

简单来说,git将所有commit组成一个大的类似链表或者树的结构,每一个commit都指向他的一个或多个父节点。在这些commit集合中,如果划归branch,git采用的做法就是让该branch指向某一个commit,在该commit之前(包括他自己)所有的commit都属于该branch。而tag跟branch的概念比较像,只不过tag是不可变的branch,就是tag也是指向一个commit,但是之后在该commit之后追加的commit不再属于该tag,这个branch不一样。

2022-11-08 15:40:33 1348 1

原创 git底层原理之git的三颗树和git reset不同参数(mixed, soft, hard)的关系

假设你在本地有一个A-B-C的提交序列,然后push到远程仓库,然后别人也在同一分支上工作,接着你的commit,又进行了D-E两个提交。然后你又将它强行推送到远程仓库(git push --force), 然后你的同伴这时要推送他的本地提交到远程,比如他可以通过rebase的方式提交,这样他提交之后,远程仓库的提交就像这样,如下图。需要注意的是git reset --hard也许是用的最多的参数,但是也是最危险的,会导致working directory和staging index的数据都被重置。

2022-11-08 15:30:38 999

原创 git revert vs git reset

git revert并不会删除要改回的commit的之后所有的历史commit, 而reset必须要删除目标commit之后所有的commit(也不是真正删除了,只是让之后的那些commit变成orphan commits,然后在git做垃圾回收时会被真正删除掉)。另外,git revert也并不会删除目标commit, 而是添加了一个新的commit,这个新的commit跟目标commit执行的是相反的动作,所以合到一起之后,就相当于undo了之前的目标commit.

2022-11-08 15:11:06 914

原创 Idea 社区版pom.xml文件显示xxx-plugin not found问题

idea使用经验

2022-09-27 15:33:06 1012

原创 Oauth2的理解

具体可以参考网站:Authorization Code Flow里边介绍的非常详细。1. Oauth2支持多种授权流程,其中的一种是Authorization code Flow,具体见图: 2. Oauth2 的参与方,以及什么时候Client与Resource Owner是同一个对象。具体说一下Resource Server,一直以为Resource Server是那种第三方提供的,可以用于下载用户头像等基础信息的,实际上远不止于此。如果我们开发自己的API应用的话。但是对于前后端分离的项目,前端是SP

2022-06-09 17:00:24 145

原创 彻底理解git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”

当clone一个远程repo之后,默认会新建一个master或main的本地分支。比如:可以看到本地默认只建了一个main分支,剩下的都是远程分支。可以在远程分支基础上checkout出一个本地分支来,比如执行命令: 这是一个本地分支develop被创建出来。就是上边输出的名字以remotes/origin/开始的分支。虽然叫远程分支,但是这些分支所对应的commits也是在我们本地的,严格来说应该叫本地的远程分支(有些别扭)。下文说的远程分支都是指这种分支,而不是指远程仓库上的分支。同时我们也

2022-06-09 16:24:52 7646 1

原创 CSRF与CORS

CSRF与CORS没有直接的联系。在CSRF攻击时,不是通过跨域访问来攻击的,比如从恶意B网站下载的javascript执行时,访问正常网站A,不是这样的。一般是从恶意网站B下载的网页里边有一个超级链接,链接到网站A,这是由于用户登陆过网站A,便会携带身份信息(主要是cookie),向A网站发起操作,比如银行转账等。Spring Security通过设定一个csrf_token的方式,并且这个token下次访问时,通过header、parameter、cookie的方式携带上来,这样Spring S

2022-05-31 18:27:04 709

原创 REST API设计

关于REST API设计是一个很大的话题,虽然网上有很多文章介绍如何设计符合REST风格的API,但是大多只是简单介绍REST API设计的一些基本原则,例举了一些非常简单的例子。但是在真实开发场景中,业务场景可能会千变万化,非常复杂,一些基本的REST设计原则很难简单到应用的我们的API设计中。这篇博客会介绍一些基本的REST API设计的知识点和注意事项,以后也会不断更新增加自己新的理解和业界的一些最佳实践。1. 在URL中,如果要包含多个单词组成的资源名称,单词之间使用中划线,不要使用驼峰和下

2022-04-15 17:12:00 567

原创 WEB应用程序如何保证时间处理时区的正确性?

在web应用开发中,经常将当前系统时间作为时间信息传给数据库保存,然后在后边的客户端浏览器访问时,有时会发现时间不是我们期望的时间,而是错误的时区的时间。要搞清楚这个问题,我们必须从几个方面着手去保证时间时区的正确处理。首先要明白几个问题:1. 数据库支持timestamp和timestamptz两种类型的数据,你需要了解你的数据库表字段使用的是那种类型。他们的区别具体可以参考我上篇博文:postgresql 数据库timezone设置,以及TIMESTAMPTZ和TIMESTAMP数据类型

2022-04-13 13:53:00 1122

原创 Postgresql 数据库时区(timezone)设置,以及TIMESTAMPTZ和TIMESTAMP数据类型的选择

timestamp和timestamptz都占用8个字节,在存储时间时并没有本质的区别,都不携带时区信息。只是在insert保存数据和select给数据库客户端返回数据时处理方式不同。下边以具体示例解释这两种数据类型的差别,以及他们与数据库链接时区(session对应的时区)和postgresql数据库时区之间的关系。下边例子使用的数据库时区是Etc/UTC (GMT + 0),首先创建表,然后做相应操作:test_db=> CREATE TABLE test_table (

2022-04-13 13:12:59 21488 1

原创 JPA 主键ID生成策略

在定义Entity的ID字段时,我们可以使用@GeneratedValue注解指定以何种方式生成数据库的主键ID的值。有几种策略:1. 默认情况下,是自动生成策略。比如下边两种方式效果是一样的。如果使用的是Springboot JPA Data, 那hibernate会自动帮我们创建一个Sequence,然后通过该Sequence,为所有生成策略是Auto的表使用该Sequence,也就是多个表共享一个Sequence。@Entitypublic class Student { @

2022-03-25 12:59:58 4677

原创 Srping JPA 数据库连接池的连接何时申请和释放,与Open Session In View的关系

在使用Spring JPA data访问数据库时, 我们要清楚何时业务线程从数据库连接池获取连接,何时释放。简单说,当Open Session In View 启用时(spring默认配置),在整个http request处理期间,一个JPA session都会绑定到该处理线程,直到该请求处理完成。但是JPA session并不是一开始就对应一个真正的数据库连接,只有当JPA的Repository接口方法被执行时,也就是sql语句要执行时,JPA session才会从数据库连接池申请一个连接。当SQL(

2022-03-24 16:39:08 5803

原创 Executor VS ExecutorService VS Executors

java并发编程:Executor、Executors、ExecutorService_River的博客-CSDN博客_executors

2022-03-08 15:34:58 76

原创 jackson fast xml 从xml中读取时间

jackson fast xml 从xml中读取时间信息时,java class时间字段使用LocalDateTime,而不是用java.sql.TimeStamp,测试中发现如果使用java.sql.TimeStamp, jackson fast xml会将从xml中读取的不带失去的时间字符串转换成本地时区的TimeStamp,而如果使用java8的LocalDateTime,就不会存在这个问题。...

2022-03-08 11:09:58 840

原创 postgresql 清空所有public schema数据

1678If all of your tables are in a single schema, this approach could work (below code assumes that the name of your schema ispublic)DROP SCHEMA public CASCADE;CREATE SCHEMA public;If you are using PostgreSQL 9.3 or greater, you may also need t.

2022-03-07 19:35:49 1423

原创 kotlin 属性重载

在kotlin中, 不仅可以对方法重载,还可以对属性重载。在java中,在子类中很少重载父类中的属性,虽然这也是可以的。比如下边的例子:open class Apple<T>{ open val info : T? constructor(){ info = null } constructor(info: T){ this.info = info }}class A(info: String): Apple

2022-02-24 15:28:55 2068

原创 kotlin backing field

kotlin的class里边的property概念跟java的class里边的feild或者property概念还不太一样。kotlin的代码最终都要转化成Java代码,kotlin的类里边的属性不一定都要对应一个java类里边的属性,必须满足一以下条件之一:1. 使用至少一个缺省accessor(getter or setter)2. 如果使用了定制accessor, 在accessor方法内,有通过feild去访问类的成员变量(Kotlin will generate a backing

2022-02-24 15:15:33 1651

原创 kotlin 使用in out限制对集合类只能使用读方法和写方法

结合上一篇java的范型通配符上下届的文章,这里给出kotlin的解决方案。in, out不仅可以用在定一个使用范型的类时,指定该范型类型只能用在方法的返回值或者输入参数,比如像下边这样:interface Source<out T> { fun nextT(): T}fun demo(strs: Source<String>) { val objects: Source<Any> = strs // This is OK, since T

2022-02-24 11:45:03 1464

原创 java如何往List<? extends number>中加入元素?体会范型集合父子关系以及范型通配符的使用

以下来自一个stackoverflow的一个问答,写的很清楚。基本上就是子类集合的引用付给父类引用,如果父类的引用变量声明的是<? extends Parent>, 则父类引用变量只能对集合进行读操作,读出来的变量是Parent类型,这是因为不确定该父类引用变量指向的是什么类型的集合,可以是Child1,也可以Child2,如果生命一个元素Parent p1,然后要加入集合,就会出错。而如果父类变量声明的形式是<? super Child>,则通过该引用变量只能近些写操作,不

2022-02-24 11:10:46 1989

原创 kotlin 什么情况下针对可空对象,可以不使用空安全调用(?.)

在看kotlin exposed源码时,看到如下语句:fun <T> transaction(db: Database? = null, statement: Transaction.() -> T): T = transaction(db.transactionManager.defaultIsolationLevel, db.transactionManager.defaultRepetitionAttempts, db, statement)发现函数参数db是可空

2022-02-17 17:45:58 3671

原创 postgresql auto increment

两种方式实现:一种是使用serial关键字, 如下:CREATE TABLE table_name( id SERIAL);另一种是手动创建sequence,并指定缺省值:CREATE SEQUENCE table_name_id_seq;CREATE TABLE table_name ( id integer NOT NULL DEFAULT nextval('table_name_id_seq'));ALTER SEQUENCE table_name_id

2022-02-17 15:31:47 686

原创 postgresql创建database, schema,用户以及权限分配

postgresql支持schema的概念,一个数据库下可以有多个schema,每个schema可以有多个表和其他数据库对象,然后每个schema可以分配给一个用户。这个时候,schema根oracle数据库的schema的概念比较像。但是对于mysql,没有类似于oracle数据库schema的概念,postgresql又提供了一个public schema概念,默认建库之后,建表时如果不指定schema,默认都是建到这个默认public schema下。postgresql就是通过这种方式保证了

2022-02-17 11:34:04 4223

原创 token与cookie认证方式对比

token进行用户身份验证的流程:客户端使用用户名和密码请求登录 服务端收到请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token后可以把它存储起来,比如放到cookie中 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据这种基于token的认证方式相比传统的session认证方式更节

2022-02-14 18:34:49 828

原创 CSRF原理及预防

CSRF攻击原理及过程如下:1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请

2022-02-14 10:57:54 196

原创 HTTP 401和403区别

官方解释:HTTP 401 错误 - 未授权: (Unauthorized)HTTP 403 Forbidden - 拒绝访问看官方解释,两个好像都跟授权相关。但我们知道一个应用分为登陆和授权两部分。判断一个用户是否有权限访问某个资源,首先判断该用户是否登陆(authenticaiton),再判断他是否有权限访问某个资源(authorization)。所以这两个错误码也就对应这两种情况。如果用户登陆失败(身份验证失败,即authenticaiton失败),则服务端返回401错误。如果

2022-02-14 10:41:03 1599

原创 kotlin用it还是this?

由于在kotlin中,可以很容易扩展已有的类,增加新的函数。这是扩展函数中,就可以使用this关键字,指代运行时与该函数关联的类的对象。而有时我们发现在写Lambda时,可以使用it关键字,同时还可以使用this关键字,这是怎么回事?比如下边的代码,在test01()方法中,it指代lambda函数本身的参数,而this,是指Test01这个对象。总之,使用this的地方,都指向一个对象,使用it的地方,都指向该函数本身的参数。至于this指向哪儿,要具体分析。import org.jun

2022-02-11 17:33:55 3503

原创 JAX-RS的ContainerRequestFilter中注入ResourceInfo, UriInfo, HttpHeaders等等request-scoped资源时,如何保证线程安全?

具体可以参考这个文档:jax rs - Request-scoped context field injections into RESTEasy singletons - Stack Overflow基本上就是在自定义的filter中注入与request相关的资源时,容器使用了代理技术, 利用了threadlocal,将这些与具体请求相关的对象放到了threadlocal变量中(一个map, key是具体的线程,value是对应的资源),这样保证Filter对象是单例的,看上去里边的field注入

2022-02-11 09:45:24 2145

原创 java与Kotlin中常量的定义, 使用public还是private定义常量?

在不使用enum的情况下,在java中定义常量,一般可以通过如下方式定义: private static final String name = "tom"; public static final String name2 = "tom2";这两种方式定义的区别是第一种方式,只有常量所在的类的方法可以访问,不管是静态还是非静态方法都可以访问。第二种方式则是全局的,所有类都可以访问。所以两种方式应对两种场景,private和public关键字可以很好的完成这个任务。而在kotli

2022-02-11 09:17:31 1615

原创 kotlin const val与val差别

const val 相当于java的static final修饰的变量,而val相当于java的final修饰的变量。

2022-02-10 17:39:43 397

原创 kotlin in out 关键字理解

在kotlin定义范型时,有时会使用到in out关键字。网上很多文章都有介绍这两个关键字的使用,越看越迷糊,比如以下边的食物、快餐、汉堡、食物商店,快餐店、汉堡店为例子:很不理解为什么下边的几行代码前两行会编译通过,而后一个会出错。val consumer1: Consumer<Burger> = FoodConsumer()val consumer2: Consumer<Burger> = FastFoodConsumer()val consumer3: Consu

2022-02-10 14:09:37 659

原创 JAX-RS @Provider注解用来做什么

被@Provider注解标注的class一定都要实现一个JAX-RS规范的接口,JAX-RS runtime(比如tomcat等)会有一个对于这些接口的一个基本的实现,我们自己实现接口相当于替换了容器实现的接口,实现一些定制化的功能Providers are a simply a way of extending and customizing the JAX-RS runtime. You can think of them as plugins that (potentially) alter th

2022-02-09 16:57:05 1381

原创 Postgresql 创建多列联合唯一索引时,其中一列可为空

有一个表,要创建两个列的唯一索引,但是有一列可以为空,这时要分两种情况建两个索引。如果只建一个,那么当parent_id为空时,即使name不同,也可以重复。也就是说加索隐时也可以使用where条件。CREATE TABLE directories ( id SERIAL NOT NULL PRIMARY KEY, parent_id INTEGER REFERENCES directories(id) ON DELETE CASCADE, name TEXT NOT NU

2022-01-29 16:17:02 4432

原创 kotlin + springboot,对于DTO的class,所有属性都要加上@JsonProperty注解?

在测试时发现,当使用resttemplate去获取远端数据时,springboot框架无法自动将收到的json数据自动反序列化成指定的类对象。需要将对应的类的每个属性都加上@JsonProperty注解,并注明对应的Json字段名才可以,比如如下:data class Bank( @JsonProperty("account_number") val accountNumber: String, @JsonProperty("trust") val trust: Dou

2022-01-28 23:01:16 1958

原创 idea 开发kotlin应用,在kotlin plugin升级到1.6.10之后, println(), listOf()等基本函数无法使用

在使用kotlin plugin 1.6.10,结合spring boot开发时,发现很多kotlin基础包中的函数无法使用,提示无法找到, 但是kotlin-stdlib: 1.6.10和kotlin-stdlib-jdk8:1.6.10明明都在类路径下。重启,删除都不好用。最后发现可以将idea的cache清空,再重启idea,就没有问题了。invalidate idea cache的方法:调出搜索窗口,然后输入"invalidate caches", 回车,在弹出窗口中,选中"clear

2022-01-24 20:34:26 2686

原创 kotlin 函数式接口和匿名接口、lambda

package com.example.blogimport java.util.ArrayList//kotlin lambda作为函数参数时://1. 函数作为另外一个函数的形参,可以直接写()-> xxx的形式,不用额外再定义一个函数式接口//2. 在调用时, 世界将形参替换成lambda.//函数式接口fun interface Even{ fun isEven(e: Int): Boolean}//非函数式接口interface Odd{ fun .

2022-01-24 16:45:32 1354

原创 kotlin companion object

总结:companion object生成的静态内部类,该内部类不会在其内部保存一个指向该类的实例,而是在外部类有一个feild指向改内部类的实例。并且该内部类不是singleton的,其有一个public的构造方法。半生类里边的所有成员可以被外部类直接访问,省去了通过Outter.Inner.xxx中的调用方式的Innner部分。而一个普通的object修饰的类,其本身内部有一个feild指向了该该类的唯一实例,也即object修饰的类是单类模式。package indi.tomclas

2022-01-24 14:12:28 2088

原创 kotlin sealed关键字

//sealed class只能有固定数量的子类,而且必须在当前类里边声明//sealed class的构造方法也是私有的,跟object比较像//enum是定义有限的对象值,二sealed class是定义有限的子类型sealed class MySealedClass { fun action(){ println("I am a sealed class") } object SonClass1 : MySealedClass(){ i.

2022-01-22 18:49:06 667

原创 Spring @Transctional和JTA @Transctional区别

提供的功能不一样。具体可以参考:https://www.baeldung.com/spring-vs-jta-transactional#:~:text=JTA%20Transactional%20annotation%20applies%20to,applies%20only%20to%20Spring%20beans.&text=However%2C%20the%20other%20way%20around,annotations%20outside%20the%20Spring%20con

2022-01-19 10:32:58 402

原创 mysql生产环境部署,创建用户,分配最少权限

具体请参考文档:​​​​​​​​​​​​​​​​​​​​​Getting Started | Accessing data with MySQL先创建用户,授予所有权限mysql> create database db_example; -- Creates the new databasemysql> create user 'springuser'@'%' identified by 'ThePassword'; -- Creates the usermysql> gr

2022-01-18 14:41:19 665

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除