git使用技巧-撤销修改
git撤销修改
丢弃工作区的修改
1 | git checkout --文件名称 |
把暂存区的修改撤销掉(unstage),重新放回工作区
1 | git reset HEAD 文件名称 |
已经commit到版本库,想撤回本次commit
前提:没有推送到远端
1 | git reset --hard HEAD^ |
或者
1 | git reset --hard commit_id |
讲分布式Id生成的文章很多,其中雪花算法也提到过多次,本文不再赘述,只是给出资源汇总,仅供参考。
1 | twitter原版,scala编写,地址:https://github.com/twitter-archive/snowflake |
代码源地址 参见
1 | 介绍参见Leaf——美团点评分布式ID生成系统 https://tech.meituan.com/2017/04/21/mt-leaf.html |
假设查询person表,参数类型为XXXVo,XXXVo中包含一个List对象,保存了状态列表,此时可以参考如下查询
1 | <select id="queryXXX" parameterType="XXXVo" |
参数同样可以通过Map对象传递到xml这个层面,此时这样写即可:
java代码:
1 | map.put(statusFilter, 列表实例对象); |
xml代码:
1 | <select id="queryXXX" parameterType="java.util.HashMap" |
1 | <where> |
1 | <if test="examTypeName!=null and examTypeName!=''"> |
1 | <if test="examTypeName!=null and examTypeName!=''"> |
google guava使用教程系列(3)- 前置条件检查
原文地址:[https://github.com/google/guava/wiki/PreconditionsExplained])(https://github.com/google/guava/wiki/PreconditionsExplained)
简而言之,guava提供了一系列检查参数的方案,个人感觉一般,实际业务场景中对于参数判断自己写可能比这种封装更方便。
官方举的例子:
1 | checkArgument(i >= 0, "Argument was %s but expected nonnegative", i); |
大致有如下几类:
http://ifeve.com/google-guava-preconditions/有翻译,但翻译不全,建议github上的原版wiki。看名字基本能猜到方法用途,看个人喜好吧,我个人倒是更喜欢apache commons里的校验方法,比如StringUtils.isEmpty()
在jdk 1.5以后,优化了,使其性能并不是像很多帖子说的那样,“非常重”
| 方法 | 说明 |
|---|---|
| lock() | 获取锁,如果锁被暂用则一直等待 |
| tryLock() | 如果获取锁的时候锁被占用就返回false,否则返回true |
| tryLock(long time, TimeUnit unit) | 比起tryLock,多出等待时间 |
| unLock() | |
| lockInterruptibly() |
性能上,竞争不激烈,两者性能;竞争激烈时,lock性能远由于sync。具体需要根据情况而定。
并不一定总是需要用lock,sync更方便,lock需要更精心维护代码、避免死锁
push
pull
的方式
惊群效应
分布式锁需要具备的条件:
几种实现方式:
略
1 | SETNX key value |
if key不存在,则设置为value;存在则不做任何操作
“SET if Not eXist”
1 | expire key seconds |
设置过期时间,如果key已国企,则将会被自动删除。
1 | del key |
删除key
原理:利用redis的setnx,如果不存在某个key则设置值,设置成功则表示锁成功
缺点:如果获取锁后的进程在没有执行完就挂了,则锁永远不会释放
改进:在基本形式锁上setnx后设置expire,保证超时后也能自动释放锁
缺点:setnx与expire不是一个原子操作,可能执行完setnx该进程就挂了
lua执行具有原子性
改进:利用lua脚本,将setnx与expire编程一个原子操作,可解决一部分问题
缺点:还是会出现锁过期的问题
官方提供的java组件:redisson
redisson的分布式可重入锁RLock java对象实现了java.util.concurrent.locks.lock接口同时还支持过期解锁
地址:
redis的可以用于哪些场景?
spring boot + spring cloud,上传附件时遇到如下错误:
1 | org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (11963927) exceeds the configured maximum (10485760) |
错误信息表示上传附件报超出自带tomacat限制大小(默认1M)\
1 | spring.http.multipart.maxFileSize = 10Mb |
1 | /** |
我这里选择只修改配置参数,就修复了问题。
本文仅展示总体配置,具体注解用法请另行搜索、查询。
1 | </pre> |
添加一个配置对象,大体代码如下:
1 |
|
例如controller
1 |
|
实体类示例:
1 |
|



以shiro为例,需做如下配置:
1 |
|
swagger2 注解说明 ( @ApiImplicitParams )
https://blog.csdn.net/jiangyu1013/article/details/83107255
spring boot项目中使用swagger2
https://www.jianshu.com/p/05be40b9a7a3
spring boot 整合 swagger2,并设置post,get请求方式
https://blog.csdn.net/qq\_36249132/article/details/90109815
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
转载自:https://www.cnblogs.com/wang-meng/p/f1532cf23ce049ce63b4bdd62d53659d.html
最近在项目上线的时候发现一个问题,从后台报错日志看:java.lang.UnsupportedOperationException异常
从代码定位来看,原来是使用了Arrays.asList()方法时把一个数组转化成List列表时,对得到的List列表进行add()和remove()操作, 所以导致了这个问题。
对于这个问题,现在来总结下,当然会总结Arrays下面的一些坑。
首先,遇到问题不可怕,遇到问题解决就是了,但是必须要保证下次不会再犯相同的问题。
Arrays.asList返回的是同样的ArrayList,为什么就不能使用add和remove方法呢?
1,查看Arrays.asList 源码
,
2,查看此ArrayList结构:
3, 在查看AbstractList结构:
果然,UnsupportedOperationException 是这里抛出的,因为Arrays中的ArrayList并没有实现此方法,故抛出了异常。
所以说 Arrays.asList 返回的 List 是一个不可变长度的列表,此列表不再具备原 List 的很多特性,因此慎用 Arrays.asList 方法。
1,下面程序输出是什么?
打印结果是:1
由上面asList 源码我们可以看到返回的 Arrays 的内部类 ArrayList 构造方法接收的是一个类型为 T 的数组,而基本类型是不能作为泛型参数的,所以这里参数 a 只能接收引用类型,自然为了编译通过编译器就把上面的 int[] 数组当做了一个引用参数,所以 size 为 1,要想修改这个问题很简单,将 int[] 换成 Integer[] 即可。所以原始类型不能作为 Arrays.asList 方法的参数,否则会被当做一个参数。
2,Collections.toArray报错问题
大家可以看下 java.util.ArrayList 源码 中特别标记有一句话如下:
Bug地址:https://bugs.java.com/view_bug.do?bug_id=6260652
那下面来试验下什么情况下会出现这种异常:
如上图,这种控制台打印的结果如下:
class [Ljava.lang.String;
Exception in thread “main” java.lang.ArrayStoreException: java.lang.Object
我们查看Arrays中ArrayList的toArray源码:
因为asList返回的是一个String数组,所以这里toArray返回的其实是String[]类型,只不过是这里做了一个向上转型,将String[]类型转为Object[]类型罢了。
但是注意,虽然返回的引用为Object[],但实际的类型还是String[],当你往一个引用类型和实际类型不匹配的对象中添加元素时,就是报错。
具体大家可以参考Java向上转型和向下转型的相关知识点。
关于Arrays中的坑就说到这里,有补充的欢迎留言。