idea
谷歌翻译插件不可用问题
142.250.4.90 translate.googleapis.com
142.250.30.90 translate.googleapis.com
142.250.99.90 translate.googleapis.com
142.250.101.90 translate.googleapis.com
142.250.105.90 translate.googleapis.com
142.250.107.90 translate.googleapis.com
172.253.112.90 translate.googleapis.com
172.253.114.90 translate.googleapis.com
172.253.116.90 translate.googleapis.com
172.253.124.90 translate.googleapis.com
docker 安装es https://smilenicky.blog.csdn.net/article/details/107254714
docker 安装ik分词器 https://blog.csdn.net/weixin_44737877/article/details/112229565
docker
docker安装mysql: https://blog.csdn.net/weixin_44888773/article/details/108599588
安装redis集群:https://www.cnblogs.com/niceyoo/p/13011626.html
使用Docker安装部署RabbitMQ
java
list 转map
Map<Integer, List> groupBy = appleList.stream().collect(Collectors.groupingBy(Apple::getId));
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a,(k1,k2)->k1));
其他
去空格啥的
List categoryIdPathList = Splitter.on(“,”).omitEmptyStrings().trimResults().splitToList(categoryIdPath);
mybatis plus 分页
Page<实体类> page = PageHelper.startPage(bo.getPageNum(), bo.getPageSize());
或者
int page = (bo.getPageNum() - 1) * bo.getPageSize();
bo.setPageNum(page < 0 ? 0 : page);
java
Path path = Paths.get(“D:/外访录音.txt”);
byte[] data = Files.readAllBytes(path);
String resultsStr = new String(data, “utf-8”);
resultList = JSON.parseArray(resultsStr,AccountVisitRecordDto.class);
map转实体
// 表头转换成字段
Map<String, String> beanMap = ConvertDataUtil.getBeanMap(importFields, dataMap);
// map转换成bean
BeanUtil.fillBeanWithMap(beanMap, letterImport, true);
/**
* 标签-工具类 获取beanMap
* @param importFields 导入字段
* @param dataMap 数据
* @return beanMap
*/
public static Map<String, String> getBeanMap(List<ImportFieldDto> importFields, Map<String, String> dataMap) {
Map<String,String> beanMap = new HashMap<>(dataMap.size());
for (ImportFieldDto importField : importFields) {
String value = dataMap.get(importField.getFieldName());
if (StringUtils.hasLength(value)) {
beanMap.put(importField.getFieldCode(), value);
}
}
return beanMap;
}
map常用方法
putIfAbsent(K key, V value) 方法,意思是,如果 map 中存在 key 了,那么 value 就不会覆盖,如果不存在 key ,新增成功。
@Test
public void compute(){
HashMap<Integer,Integer> map = Maps.newHashMap();
map.put(10,10);
log.info("compute 之前值为:{}",map.get(10));
map.compute(10,(key,value) -> key * value);
log.info("compute 之后值为:{}",map.get(10));
// 还原测试值
map.put(10,10);
// 如果为 11 的 key 不存在的话,需要注意 value 为空的情况,下面这行代码就会报空指针
// map.compute(11,(key,value) -> key * value);
// 为了防止 key 不存在时导致的未知异常,我们一般有两种办法
// 1:自己判断空指针
map.compute(11,(key,value) -> null == value ? null : key * value);
// 2:computeIfPresent 方法里面判断
map.computeIfPresent(11,(key,value) -> key * value);
log.info("computeIfPresent 之后值为:{}",map.get(11));
}
linux
下载
https://man.linuxde.net/download/CentOS_6_8
安装镜像:
https://blog.csdn.net/weixin_42512937/article/details/109092246
ifconfig出现command not found 的解决办法
https://blog.csdn.net/xinyuanjieyiwife/article/details/106480015?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base
java8
resultList.sort(Comparator.comparing(GradeCoefficientCommissionDetailDto::getCustomerName).thenComparing(GradeCoefficientCommissionDetailDto::getGear));
mysql
linux安装mysql:
1、亲测好使:https://blog.csdn.net/qq_36183235/article/details/103656648
连接mysql报错:https://blog.csdn.net/jartins/article/details/79788469
mac
mac安装windows10:https://blog.csdn.net/chenhao_c_h/article/details/80276610
mac安装gradle: https://www.jianshu.com/p/c28062f94809
https://gradle.org/releases/
mybatis
and end_date <![CDATA[>=]]> CONCAT(#{bo.endDate },' 00:00:00')
and end_date <![CDATA[<=]]> CONCAT(#{bo.endDate},' 23:59:59')
easyexcel 官网
https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write
很好用的节假日api
https://zhuanlan.zhihu.com/p/343863993
oracle表结构生成表
https://blog.csdn.net/weixin_46415304/article/details/126012746
手动加事务
引入包
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus
@Resource
private TransactionDefinition transactionDefinition;
@Resource
private DataSourceTransactionManager dataSourceTransactionManager;
TransactionStatus transactionStatus = null;
try {
//手动开启事务
transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
//更新申请表
XXXX
//手动提交事务
dataSourceTransactionManager.commit(transactionStatus);
return Result.success("审批成功");
} catch (Exception e) {
//回滚事务
if (transactionStatus != null) {
dataSourceTransactionManager.rollback(transactionStatus);
}
return Result.fail("审批失败");
}
}
mysql
避免索引失效问题
计算、函数、类型转换(自动或手动)导致索引失效
like以通配符%开头索引失效
不等于(!= 或者<>)索引失效
is null可以使用索引,is not null无法使用索引
OR 前后存在非索引的列,索引失效
尽量使用 覆盖索引 (只访问索引的查询(索引列包含查询列)),减少select *语句
字符串不加单引号索引失效
联合索引失效(索引不完整,索引中断,非等值匹配,最左索引缺失)
执行计划explain
Sql查询比较慢
先定位慢查询
使用EXPLAIN 分析该慢查询语句
id:选择标识符
select_type:表示查询的类型。
table:输出结果集的表
partitions:匹配的分区
type:表示表的连接类型 (次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL)
possible_keys:表示查询时,可能使用的索引
key:表示实际使用的索引
key_len:索引字段的长度
ref:列与索引的比较
rows:扫描出的行数(估算的行数)
filtered:按表条件过滤的行百分比
Extra:执行情况的描述和说明询,又是上述三种复杂查询中
Using where:表示MySQL将对存储引擎层提取的结果进行过滤,过滤条件字段无索引, Using where本身其实和是否使用索引无关,它表示的是Server层对存储引擎层返回的数据所做的过滤。当然该过滤可能会回表,也可能不会回表,取决于查询字段是否被索引覆盖。
Using index:表示直接访问索引就足够获取到所需要的数据,不需要通过索引回表;
Using index condition:在5.6版本后加入的新特性(Index Condition Pushdown);
Using index condition 根据条件索引查询,但是需要回表查询数据
Using where; Using index 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
Using filesort (文件排序) mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。
Using temporary(创建临时表)用临时表保存中间结果,常用于GROUP BY 和 ORDER BY操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。
注意:当Extra显示Using filesort或者Using temporary时说明你写的sql一定要优化了!!!
大批量in优化
SELECT *
FROM (
SELECT '00010448' id UNION ALL
SELECT '00010450' UNION ALL
SELECT '00010454' UNION ALL
SELECT '00010455' UNION ALL
SELECT '00011073'
) AS tmp,account a
WHERE tmp.id = a.id;
批量更新优化
update account as a,(
select 1 as id, 'new_name_1' as name
union all select 2, 'new_name_2'
union all select 3, 'new_name_3'
-- 依此类推,每组200条记录的更新数据
) as tmp
set a.name = tmp.name
where a.id = tmp.id;
批量插入
循环插入 + 开启批处理模式(总耗时:1.7秒)(重点:一次性提交)
@GetMapping("/forSaveBatch")
public void forSaveBatch(){
// 开启批量处理模式 BATCH 、关闭自动提交事务 false
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,false);
// 反射获取,获取Mapper
AccountMapper accountMapper = sqlSession.getMapper(StudentMapper.class);
long startTime = System.currentTimeMillis();
for (int i = 0 ; i < 50000 ; i++){
Account account = new Account(i,"账户id" + i,"外包序号"+ i,。。。);
accountMapper.insertStudent(account);
}
// 一次性提交事务
sqlSession.commit();
// 关闭资源
sqlSession.close();
long endTime = System.currentTimeMillis();
System.out.println("总耗时: " + (endTime - startTime));
}
总耗时:1.7秒
异常和故障知识库
1. 常见问题异常
1. NullPointerException是Java中最常见的异常之一,通常在试图访问或操作一个null对象时引发。
2. ArrayIndexOutOfBoundsException异常通常在试图访问数组的非法索引时引发。
3. ClassCastException异常通常在试图将一个对象强制转换为不兼容类型时引发。
4. IOException是Java处理I/O操作时常见的异常,例如读取文件、网络通信等。
5. FileNotFoundException是IOException的一个子类,通常在试图打开不存在的文件时引发。
6. NumberFormatException通常在试图将一个不合法的字符串转换为数字时引发。
2. 6大OOM的认识(重点)
1. java.lang.StackOverflowError在一个函数中调用自己就会产生这样的错误(栈溢出)
2. java.lang.OutOfMemoryError: Java heap space一个很大对象,造成堆内存溢出
3. java.lang.OutOfMemoryError: GC overhead limit exceededGC回收时间过长,超过98%的时间用来做GC,并且回收了不到2%的堆内存
4. java.lang.OutOfMemoryError: Direct buffer memory直接内存不足
5. java.lang.OutOfMemoryError : unable to create new native thread一个应用进程创建了多个线程,超过系统承载极限,Linux默认允许单个进程可以创建的线程数1024
6. java.lang.OutOfMemoryError: Metaspace不断生成类往元空间推,类占据的空间总是会超过Metaspace的大小
问题排查
CPU飙增
-
用 top 命令查看cpu占用情况

-
用 top -Hp 命令查看线程的情况
可以看到是线程id为7287这个线程一直在占用cpu

-
printf “%x” 把线程号转换为16进制
[root@localhost ~]# printf "%x" 7287
1c77
记下这个16进制的数字,下面我们要用
- 用jstack工具查看线程栈情况
jstack 7268 | grep 1c77 -A 10

死锁
(1)死锁产生的四个条件:
互斥:共享资源X和Y只能被一个线程占用
占有且等待:线程T1已经获取共享资源X,在等待共享资源Y的时候,不释放共享资源X
不可抢占:其他线程不能强行抢占线程T1占有的资源
循环等待:线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源,这就是循环等待。
(2)死锁定位:
- 查看进程
jps -l - 查看死锁的线程
jstack -l 7|grep “deadlock”

内存泄漏
内存泄漏会造成的响应时间变长。这是因为频繁发生的GC会暂停其它所有线程(Stop The World)造成的。
(1)垃圾回收统计
jstat -gcutil 1403 1000 10
垃圾回收统计,每1000ms打印一次,共打印10次。
单位是百分比。
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元空间数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

常规的JVM参数配置:
对于8G内存,一般分配一半的最大内存就可以了,因为机器本上还要占用一定内存,一般是分配4G内存给JVM,
-Xms4096M -Xmx4096M -XX:MetaspaceSize=384M
将-Xms和-Xmx两个参数配置相同的值,其目的是为了垃圾回收机清理完堆区后不需要重新计算堆区的大小,从而提高性能.

1万+

被折叠的 条评论
为什么被折叠?



