2021年开发踩坑记录

20210301 maven打包问题

在IDEA中配置好maven后,依赖添加正常,项目运行正常,使用IDEA自带打包插件也可以打包
但是在命令行中打包异常,无法打包,会提示很多error信息
经排查后发现,maven在命令行执行打包时,默认读取的配置文件是settings.xml,而不是IDEA选择的配置文件
修改settings.xml配置文件后,打包正常。

20210301 关于spring boot配置文件问题

spring boot打包的jar包启动时,可以指定配置文件启动,但是直接使用java -jar的方式使用外部配置文件时
指定的配置文件仅有application.properties 和xx.yml

20210301 ansible接口调用异常

在使用python调用ansible接口时,抛出了psutil依赖找不到的异常
排查发现,我安装的ansible版本为2.9.16,默认支持的python2
环境里安装的python是python3,pip3安装时将依赖安装到了python3
使用pip安装后正常

20210316 greepplum数据库查询异常

在查询greenplum数据库时,遇到这样一个问题,同一个表 select * from "TEST" 可以正常查询,但是使用select * from test
就无法查询,提示表不存在,表名是不区分大小写的,查找资料后发现是建表语句的问题,在建表,表名增加了双引号,导致查询时必须使用和双引号内部一样的表名,如下图论坛中的回复所示
在这里插入图片描述

20210325 代码排序异常

排序代码如下,查询数据库,然后格式化时间,根据时间进行排序
但是数据库中的数据存在一样的时间,就导致了排序异常,逻辑互相冲突,修改时间后再无异常出现

 SimpleDateFormat inSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 Collections.sort(list, (o1, o2) -> {
                try {
                    if (inSdf.parse(o2.getAllocateTime()).getTime()  >= inSdf.parse(o1.getAllocateTime()).getTime()) {
                        return 1;
                    }
                } catch (ParseException e) {
                    e.printStackTrace();
                    return -1;
                }
                return -1;
            });
20210618 上述bug又出现了,排序异常,还是相同的问题,没有考虑到相等的情况,每次修改数据库的行为并不可取,开始排查,原因就是没有考虑到俩个元素相同的问题,导致出现了异常,后来采用.compareTo()方法后,异常解决

看源码后发现,源码是多了一个等于情况的判断,所以就没有了异常

public static int compare(long x, long y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

20210412 mybatis删除无效bug修复过程记录

场景:webservice接口无法正常删除不需要的用户信息

排除过程

1:检查业务逻辑,业务逻辑无异常
2:因存在计数器统计删除计数,怀疑为多线程导致,加锁后,依旧无法删除
3:传参问题,参数传递无异常
4:mybaits参数传递问题,排除,参数传递正常
5:逐句分析代码作用与逻辑,发现漏洞,码的智障,查询出的id没有赋值,淦

20210531 elasticSearch聚合索引查询异常

在使用java代码去查询es时,若es的索引无数据,会报404异常

20210532 elasticSearch聚合索引查询排序异常

场景:
在使用java代码去查询es时,对日期类型的字段进行排序,发发生了排序异常,无法排序
异常排查:
1、测试环境所使用es版本为7.2,修改该字段类型为keyword,可以排序
2、生产环境使用es版本为7.4,修改字段类型为keyword,无法排序,修改为类型为date,还是无法排序
解决方案:
1、在java查询代码中给字段加了.keyword,后缀后,可以进行排序查询,但还不是真正的无法排序的原因

  builder.sort("pushTime.keyword", SortOrder.DESC);

2:查es中的mapping配置后发现,定义的数据类型与模板不一致,经排查后发现,建立索引时使用了索引模板

3、索引模板中的index_patterns字段必须要和索引名称一致,这样建立的索引,才会使用该索引模板
即数据类型会使用模板里的数据类型

4、index_patterns是索引模式,指当创建以index*
开头的索引时,使用该索引模板。
注意,在elasticsearch的6.x版本中,索引模板模式index_patterns取代原来的template。
索引模板信息可参考下面的文章
https://www.cnblogs.com/Neeo/articles/10869231.html

20210621 mybatis-plus多数据源配置异常

一直在使用的mybatis多数据源配置,迁移到新项目中,突然无法生效了,只会去查询第二个数据源的数据库,导致很多业务逻辑无法跑了,配置多数据源的方法比较简单,直接两个配置类进行配置,一个类配置一个数据源,指定一个数据源为主数据源

在这里插入图片描述
配置内容就更简单了:主数据源
在这里插入图片描述
从数据源与主数据源内容基本一致,只需去除primary主机,并修改相应类名即可,但是,突然不生效了,就是无法查询,找了很多方法,都不行,后来注意到,从数据源中少了句代码,就是下面的这句:
在这里插入图片描述
因为少了这句代码,spring在进行数据源初始化时,会把MybatisConfiguration这个配置文件初始化两次,即从数据源配置会覆盖主数据源配置,导致查询异常。。。。

20210719 hashMap值修改未生效问题

hashMap存入时会先获取key的hash值,
调用putVal方法,传入key的hash值,key,value,
在该方法内部,会将传入的hash值与已有hash值进行比较,
简单看了下源码,如简单遍历ArrayList<HashMap<String,String>>,
取出值并修改后插入新的ArrayList时,值修改可能会失效,个人理解可能存在差异

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
			   boolean evict) {
	//建立节点tab,p,定义临时变量n,i,table为第一次使用时初始化的hashtable
	Node<K,V>[] tab; Node<K,V> p; int n, i;
	//获取hash表长度
	if ((tab = table) == null || (n = tab.length) == 0)
		n = (tab = resize()).length;
	//取出hash值,与新值比较,不存在则插入新的节点
	if ((p = tab[i = (n - 1) & hash]) == null)
		tab[i] = newNode(hash, key, value, null);
	else {
		//存在,则进行hash值比较判断,K为当前hashmap的key
		Node<K,V> e; K k;
		//如果传入的key的hash值与key值与已存在的key相等且不为空,为节点e赋值
		if (p.hash == hash &&
			((k = p.key) == key || (key != null && key.equals(k))))
			e = p;
		//左边的对象是否是它右边的类的实例,返回 boolean 的数据类型
		//此处判断p是否存在与当前hashMap的TreeNode中
		else if (p instanceof TreeNode)
			e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
		else {
			//都不存在时,开始遍历已有集合,进行判断插入?
			for (int binCount = 0; ; ++binCount) {
				if ((e = p.next) == null) {
					p.next = newNode(hash, key, value, null);
					if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
						treeifyBin(tab, hash);
					break;
				}
				if (e.hash == hash &&
					((k = e.key) == key || (key != null && key.equals(k))))
					break;
				p = e;
			}
		}
		//已存在,判断值是否需要替换
		if (e != null) { // existing mapping for key
			V oldValue = e.value;
			if (!onlyIfAbsent || oldValue == null)
				e.value = value;
			afterNodeAccess(e);
			return oldValue;
		}
	}
	//容量增加,判断容量是否增加?自动扩容?
	++modCount;
	if (++size > threshold)
		resize();
	//节点之后插入
	afterNodeInsertion(evict);
	return null;
}

20210830 es数据插入异常

在往es里插入数据时,发现新接入的日志数据无法正常插入,且只有极少数的日志可以插入;
开始排查业务代码,发现业务代码并没有问题,数据也可以正常读出,但是无法插入;
将服务部署在服务器上时,也无法插入,且没有任何异常信息,
于是开始对比新旧日志的区别,发现旧的日志数据中,有一个时间字段格式为 yyyy-MM-dd HH:mm:ss ,但是新日志的该字段数据格式为 yyyy-MM-dd HH:mm:ss.SSS,在建立es字段索引时,已经约束了该字段格式只能是yyyy-MM-dd HH:mm:ss,所以新日志数据无法插入。

20210923 spring boot中this方法调用导致aop失效

在使用AOP去对某些方法的返回值做处理时,发现一个问题,
使用this的方式去调用方法时,该方法的返回值不会被aop处理,
使用注解,代理生成自身对象后,再调用该方法,返回值被AOP处理;
至此,问题结束,但是没有考虑为什么this调用的方式不会被AOP处理。

疑问:那么为什么this的aop会失效呢?

在看了一大堆大佬的文章后,发现最终结论,过程比较复杂,有兴趣的可以去看一下
结论如下:
1、spring中,非动态代理生成的对象,不会被aop捕捉;
2、因为AOP动态代理的方法真实调用,会使用真实被代理对象实例进行方法调用,
故在实例方法中通过this获取的都是被代理的真实对象的实例,而不是代理对象自身。
参考链接:
csdn: https://blog.csdn.net/qq_33589510/article/details/120387044
oschina: https://my.oschina.net/guangshan/blog/1807721

20211028 docker容器启动即退出

若dockerfile中没有CMD去执行运行命令
打出的镜像包是直接运行不起来的
需用docker run 镜像 启动命令
这种方式进行容器启动
若带CMD,且CMD中的命令是一直与终端有交互的
打出的镜像包可以直接启动运行

此方式可以不启动任务程序运行容器镜像

docker run -d -p 9400:8100 镜像名 bash -c 'while true; do echo week;sleep 60; done ’

20211028 python项目启动

最近业务有涉及到python项目的启停问题,总结如下

django项目运行方式

****此命令需要在django项目所在文件夹执行

nohup python3 manage.py runserver 0.0.0.0:8100

flask项目启动方式,此处使用了gunicorn

****此命令需要在flask项目所在文件夹执行

gunicorn app:app -c gunicorn.conf.py 

gunicorn.conf.py 配置文件 配置启动进程数,端口

workers = 5    # 定义同时开启的处理请求的进程数量
worker_class = "gevent"   # 采用gevent库,支持异步处理请求
bind = "0.0.0.0:8888"    # 端口绑定

项目停止脚本

此命令基本适用于单服务停止

 kill -9 `lsof -i:启动端口 | awk 'NR==2{print $2}'`

20211229 mysql锁库

中午的时候,正式环境的数据库突然被锁库,导致数据无法更新
开始进行排查,经资料搜索后,发现这些信息都存放于information_schema库中
可以用下面三张表来查原因:
innodb_trx ## 当前运行的所有事务
innodb_locks ## 当前出现的锁
innodb_lock_waits ## 锁等待的对应关系
一张一张的去进行查询,发现长时间处于RUNNING的任务时
在mysql命令行中 使用kill 任务id 即可杀死进程 解除表锁,业务恢复正常
注:此处的id常为一串数字,可多次进行尝试
产生锁库原因时某一sql运行时间过长,导致整个mysql库被锁,其他位于该服务库的库全被锁
附上参考链接:
https://blog.csdn.net/weberhuangxingbo/article/details/88709556

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名一小卒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值