Socket编程
Socket:
The unique combination of IP address and Port number together are termed as Socket.
REF: Basics of Computer Networking - GeeksforGeeks
socket 是一种操作系统提供的进程间通信机制。
REF: 网络套接字 - 维基百科,自由的百科全书
Socket:
The unique combination of IP address and Port number together are termed as Socket.
REF: Basics of Computer Networking - GeeksforGeeks
socket 是一种操作系统提供的进程间通信机制。
REF: 网络套接字 - 维基百科,自由的百科全书
三资握手的目的是:确认自己的接收能力和发送能力OK,还要确认对方的接收能力和发送能力OK;
保证能成功通知对方自己的ISN(Initial Sequence Number,这个ISN是作为自己以后数据通信的序号)。
主要是要初始化Sequence Number 的初始值。通信的双方要互相通知对方自己的初始化的Sequence Number(缩写为ISN:Inital Sequence Number)——所以叫SYN,全称Synchronize Sequence Numbers。也就上图中的 x 和 y。这个号要作为以后的数据通信的序号,以保证应用层接收到的数据不会因为网络上的传输的问题而乱序(TCP会用这个序号来拼接数据)。
数据重传机制
客户端:C (192.168.103.34)
服务端:S (14.18.201.48)
第一次握手:
首先C发起连接请求 [syn] Seq=2070720725
,
C进入SYN_SEND状态;
第二次握手:
接着S收到请求后,返回 [syn ack] Seq=3747916590 Ack=2070720726
S进入SYN_RECV状态;
第三次握手:
C收到S返回的信息,验证成功后返回确认信息 [ack] Seq=2070720726 Ack=3747916590
C进入ESTABLISH状态。S收到后也进入ESTABLISH状态。
注意:wireshark默认显示的sequence number是相对的数字 ,可以通过如下图的方式取消
Basics of Computer Networking - GeeksforGeeks
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
另一种更轻量级的解决方案是幂等设计。我们可以通过一些技巧把withdraw变成幂等的,比如:
1 | int create_ticket() |
create_ticket的语义是获取一个服务器端生成的唯一的处理号ticket_id,它将用于标识后续的操作。idempotent_withdraw和withdraw的区别在于关联了一个ticket_id,一个ticket_id表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果。这样,idempotent_withdraw就符合幂等性了,客户端就可以放心地多次调用。
基于幂等性的解决方案中一个完整的取钱流程被分解成了两个步骤:1.调用create_ticket()获取ticket_id;2.调用idempotent_withdraw(ticket_id, account_id, amount)。虽然create_ticket不是幂等的,但在这种设计下,它对系统状态的影响可以忽略,加上idempotent_withdraw是幂等的,所以任何一步由于网络等原因失败或超时,客户端都可以重试,直到获得结果。
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line …… If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
POST所对应的URI并非创建的资源本身,而是资源的接收者。
比如:POSThttp://www.forum.com/articles
的语义是在http://www.forum.com/articles
下创建一篇帖子,HTTP响应中应包含帖子的创建状态以及帖子的URI。两次相同的POST请求会在服务器端创建两份资源,它们具有不同的URI;所以,POST方法不具备幂等性。而PUT所对应的URI是要创建或更新的资源本身。比如:PUThttp://www.forum/articles/4231
的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有幂等性。
https://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html
https://juejin.im/post/5bbdc1ff6fb9a05d011cfe66
配置 git config core.ignorecase false --global
,大小写默认不敏感
https://codeday.me/bug/20170816/58438.html
Git - 子模块
首先移除模块依赖,git rm --cached library/algs4
其次重新添加模块依赖git submodule add https://github.com/lyloou/algs4 library/algs4
-X
参数On the basis of how we specify JVM option it can be divided into two parts, JVM Options which starts with –X and those which starts with -XX:
- JVM Options that begin with -X are non-standard (thy are not guaranteed to be supported on all JVM implementations), and are subject to change without notice in subsequent releases of the JDK.
- JVM Options or parameters which are specified with -XX are not stable and are not recommended for casual use. These options are subject to change without notice also.
10 Examples of HotSpot JVM Options in Java
【推荐】给 JVM 环境参数设置-XX:+HeapDumpOnOutOfMemoryError 参数,让 JVM 碰到 OOM 场
景时输出 dump 信息。
说明:OOM 的发生是有概率的,甚至相隔数月才出现一例,出错时的堆内信息对解决问题非常
有帮助。
// 《阿里巴巴 Java 开发手册 1.4.0pdf - p34》
-D
参数参数 -D
是 Java 自带的,其功能是通过命令行设置一个 Java 系统属性。
-Xms2G
-Xmx2G
-XX:NewRatio=4
-XX:SurvivorRatio=8
-XX:UseParNewGC
-XX:UseParallelOldGC
-XX:UseConcMarkSweepGC
-XX:+PrintGC
-XX:+PrintGCDetails
1 | <?xml version="1.0" encoding="utf-8"?> |
How to define a live template
Go to File->Settings->Editor->Live Templates.
In the right panel tree select category other.
Click the plus (+) sign on the top right, select Live Template.
Set
Abbreviation: log
Description: Inserts private static Logger for slf4j
Template text: private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger($CLASS_NAME$.class);$END$
Now click the Edit Variables button, we will tell the IDE what $CLASS_NAME$ means here. $END$ means where to place the cursor after template expansion.
Name: CLASS_NAME
Expression: className()
Default value: leave empty
Skip if defined: true (check the checkbox)
At the very bottom look for text Applicable in with a link Change next to it, click it. Select Java->declaration.
Congratulations, you’re done! Just type log and press Tab anywhere in the class declaration.
1 | log4j.debug=false |
完整配置: http://javapub.iteye.com/blog/866664
1 | log4j.rootLogger=CONSOLE,FILE |
https://tutorials.ubuntu.com/tutorial/install-and-configure-samba#0
https://blog.csdn.net/wbaction/article/details/72758673
1 | sudo apt-get install samba |
1 | sudo vim /etc/samba/smb.conf |
添加在后面
1 | [smbshare] |
1 | sudo smbpasswd -a $USER |
1 | sudo service smbd restart |
1 | sudo apt remove --purge samba samba-common |
sudo apt remove –purge samba samba-common
sudo apt install samba
https://m.imooc.com/collector/read/60
HttpMessageConverter
https://m.imooc.com/collector/read/62
SqlSessionFactory
SqlSession
Mapper
Configuration
Plugin
TypeHandler
Alias
https://m.imooc.com/collector/read/63
实现从数据库和POJO之间的相互转换。
使用
#{sex, typeHandler=com.imooc.ssm.typehandler.SexTypeHandler}
https://m.imooc.com/collector/read/65
通过动态代理的方式来修改MyBatis的底层内容;
插件应用:如分页插件、性能分析插件
开发步骤:
https://m.imooc.com/collector/read/66
保证两个操作要么都成功,要么都失败。
Spring 数据库事务流程是通过Spring AOP实现的,而Spring AOP则是通过动态代理技术来实现的。
执行业务的过程中,如果发生异常且满足事务配置,则会回滚事务(rollback)。
如果一切正常或者异常是事务配置允许的,则会提交事务(commit)。
https://m.imooc.com/collector/read/71
@Transactional
https://m.imooc.com/collector/read/71
4个。
未提交读:Read uncommited
提交读:Read commit
可重复读:Repeatable read
序列化:Serializable
https://m.imooc.com/collector/read/73
隔离级别\现象 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读:Read uncommited | v | v | v |
提交读:Read commit | x | v | v |
可重复读:Repeatable read | x | x | v |
序列化:Serializable | x | x | x |
https://m.imooc.com/collector/read/73
是否会出现幻读
https://m.imooc.com/collector/read/73
选择隔离级别主要从防止丢失更新和性能两方面来考虑
https://m.imooc.com/collector/read/73
一般企业用的是:提交读:Read
这个级别,它适合在高并发的场景下使用。
默认的隔离级别是:Isolation.DEFAULT
,Oracle和MySQL有不同的设置:Oracle使用的是提交读:Read
,MySQL使用的是可重复读:Repeatable
MySQL支持全部4个级别;
Oracle只支持提交读:Read
和序列化:Serializable
两个级别;
https://m.imooc.com/collector/read/73
7种
默认的是PROPAGATION_REQUIRED
https://m.imooc.com/collector/read/74
子事务方法采用独立的事务模式,如果子方法发生异常,也不回滚原方法事务方法的事务。
(对于支持保护点(savepoint)的数据库使用保护点,否则Spring就会创建新的数据库事务来运行它)
https://m.imooc.com/collector/read/74
首先NESTED是延续当前事务,NESTED只是回滚子方法执行过的SQL,而不是全局回滚,但是他不能重新设置事务的属性,
比如不能重新设置事务的隔离级别、超时时间和锁等。
而REQUESTS_NEW会重新建事务,我们可以重新设置事务的属性。
https://m.imooc.com/collector/read/74