- 博客(220)
- 收藏
- 关注
原创 CPU iowait是什么意思
举个例子,当服务器要访问网络文件系统(比如storage server通过NFS方式让客户端访问),由于网络的问题或者远端server性能问题导致响应慢,而当前服务器又有大量进程、线程要访问这个远端文件系统,当这些进程、线程在某个时刻都处于等待IO的状态,这是这个CPU时间片就会被统计到iowait中。我们直到,在cpu运行进程、线程时,遇到IO操作,因为IO读写通常比较慢,CPU通常可以阻塞线程,转去执行其他线程,做其他事情。等IO完成之后,通过中断,再通知CPU继续执行之前的线程。
2024-03-03 17:13:49
863
原创 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
1485
原创 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
1127
原创 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
985
原创 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
238
原创 彻底理解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
12505
4
原创 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
894
原创 REST API设计
关于REST API设计是一个很大的话题,虽然网上有很多文章介绍如何设计符合REST风格的API,但是大多只是简单介绍REST API设计的一些基本原则,例举了一些非常简单的例子。但是在真实开发场景中,业务场景可能会千变万化,非常复杂,一些基本的REST设计原则很难简单到应用的我们的API设计中。这篇博客会介绍一些基本的REST API设计的知识点和注意事项,以后也会不断更新增加自己新的理解和业界的一些最佳实践。1. 在URL中,如果要包含多个单词组成的资源名称,单词之间使用中划线,不要使用驼峰和下
2022-04-15 17:12:00
730
原创 WEB应用程序如何保证时间处理时区的正确性?
在web应用开发中,经常将当前系统时间作为时间信息传给数据库保存,然后在后边的客户端浏览器访问时,有时会发现时间不是我们期望的时间,而是错误的时区的时间。要搞清楚这个问题,我们必须从几个方面着手去保证时间时区的正确处理。首先要明白几个问题:1. 数据库支持timestamp和timestamptz两种类型的数据,你需要了解你的数据库表字段使用的是那种类型。他们的区别具体可以参考我上篇博文:postgresql 数据库timezone设置,以及TIMESTAMPTZ和TIMESTAMP数据类型
2022-04-13 13:53:00
1263
原创 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
25651
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
5237
原创 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
6485
1
原创 Executor VS ExecutorService VS Executors
java并发编程:Executor、Executors、ExecutorService_River的博客-CSDN博客_executors
2022-03-08 15:34:58
130
原创 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
913
原创 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
1797
原创 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
2201
原创 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
1740
原创 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
1545
原创 java如何往List<? extends number>中加入元素?体会范型集合父子关系以及范型通配符的使用
以下来自一个stackoverflow的一个问答,写的很清楚。基本上就是子类集合的引用付给父类引用,如果父类的引用变量声明的是<? extends Parent>, 则父类引用变量只能对集合进行读操作,读出来的变量是Parent类型,这是因为不确定该父类引用变量指向的是什么类型的集合,可以是Child1,也可以Child2,如果生命一个元素Parent p1,然后要加入集合,就会出错。而如果父类变量声明的形式是<? super Child>,则通过该引用变量只能近些写操作,不
2022-02-24 11:10:46
2423
原创 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
3727
原创 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
861
原创 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
4628
原创 token与cookie认证方式对比
token进行用户身份验证的流程:客户端使用用户名和密码请求登录 服务端收到请求,验证用户名和密码 验证成功后,服务端会签发一个token,再把这个token返回给客户端 客户端收到token后可以把它存储起来,比如放到cookie中 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据这种基于token的认证方式相比传统的session认证方式更节
2022-02-14 18:34:49
984
原创 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
257
原创 HTTP 401和403区别
官方解释:HTTP 401 错误 - 未授权: (Unauthorized)HTTP 403 Forbidden - 拒绝访问看官方解释,两个好像都跟授权相关。但我们知道一个应用分为登陆和授权两部分。判断一个用户是否有权限访问某个资源,首先判断该用户是否登陆(authenticaiton),再判断他是否有权限访问某个资源(authorization)。所以这两个错误码也就对应这两种情况。如果用户登陆失败(身份验证失败,即authenticaiton失败),则服务端返回401错误。如果
2022-02-14 10:41:03
2465
原创 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
4156
原创 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
2239
原创 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
1815
原创 kotlin const val与val差别
const val 相当于java的static final修饰的变量,而val相当于java的final修饰的变量。
2022-02-10 17:39:43
478
原创 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
764
原创 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
1694
原创 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
5058
原创 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
2098
原创 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
2926
原创 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
1448
原创 kotlin companion object
总结:companion object生成的静态内部类,该内部类不会在其内部保存一个指向该类的实例,而是在外部类有一个feild指向改内部类的实例。并且该内部类不是singleton的,其有一个public的构造方法。半生类里边的所有成员可以被外部类直接访问,省去了通过Outter.Inner.xxx中的调用方式的Innner部分。而一个普通的object修饰的类,其本身内部有一个feild指向了该该类的唯一实例,也即object修饰的类是单类模式。package indi.tomclas
2022-01-24 14:12:28
2340
原创 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
761
原创 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
568
原创 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
774
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人