采坑集锦,持续更新

239 阅读4分钟

采坑集锦(持续更新)

这些年踩过的坑,提醒自己!!

  • 数据库部分
1.Mysql 查看binlog
mysqlbinlog --no-defaults --base64-output=decode-rows  -v binlog.000001
/opt/soft/mysql-8.0.12-el7-x86_64/data
mysql binlog 里 CURRENT_TIMESTAMP 为确定的时间值
2.mongodb 导出集合
mongoexport -d collectionName -c pads -o /home/collectionName/pads.json --type json
3.redis中的bitMap可以用来进行统计或者计算
利用setBit方法 通过key、value、score来进行统计。
例如:统计用户日活跃度
setbit date userid 1 就可以表示在date这天userid的这个用户登录了
例如:过期订单到时取消
setbit key orderNo timeStamp 这里timeStamp表示订单的过期时间,通过zrangeWithScores命令获取按score(这里指timeStamp)升排序获得整个集合,就能获得一个过期时间有小到大的结合,在进行相关的操作即可
4.待补充
  • 开发工具部分
1.在idea中使用lombok插件时,如果在已经导入正确版本的lombok.jar包后依然在编译时提示找不到getset方法,那么很可能是因为idea的jdk运行版本选择的不对。应该跟项目的jdk版本保持一致
File->project structure -> project 
2.安装完redis之后正常启动,在项目中却无法访问,提示连接被拒,可能原因为:
2.1 端口未开放,如果是阿里云的机器,不仅要开放云机器防火墙的端口,还同时要在阿里云控制平台中在对应机器上添加安全组策略,暴露所需要开放的端口
查看已经开放的端口:
firewall-cmd --list-ports
开启端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效
ps:
firewall-cmd --reload #重启firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
2.2 在redis配置文件中 redis.conf,未将bind 127.0.0.1注释,所以redis会禁止除本地之外所有的ip访问
3.mysql给用户指定权限
3.1首先创建用户(略)
3.2利用grant授权:grant all privileges on `database`.* to 'username'@'localhost';(如果需要外网访问则将localhost改为'%')
3.3查看权限show grants for user;
3.4删除权限:REVOKE ALL PRIVILEGES ON *.* FROM username;
3.5所有操作之后都需要 flush privileges; 不然不会生效!
  • java相关
1.部署的java后端服务在运行一段时间后突然所有接口无响应,查看日志得知,在代码中使用random随机数时,如果服务运行在linux环境会造成延迟超时。
原因:SecureRandom generateSeed()。它使用/dev/random生成种子。但是/dev/random是一个阻塞数字生成器,如果它没有足够的随机数据提供,它就一直等,这迫使JVM等待。键盘和鼠标输入以及磁盘活动可以产生所需的随机性或熵。但在一个服务器缺乏这样的活动,可能会出现问题。
解决方法:
  1.1 可以通过配置JRE使用非阻塞的Entropy Source:在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。 
  1.2 打开$JAVA_PATH/jre/lib/security/java.security这个文件 
找到  securerandom.source=file:/dev/random 替换为securerandom.source=file:/dev/./urandom
2.在springmvc中需要重复读取request中的inputstream
因为request中的Inpustream只能被读取一次,如果在前置拦截器中读取过后,后面的方法都会读不到request中的内容,所以需要一个特殊的包装类来解决这个问题。
解决:1.1创建一个继承HttpServletRequestWrapper的包装类用来复制request中的请求数据。
     1.2创建一个Filter用来过滤需要复制request数据的请求并且用自己的装饰类Request替换原有的Request传给下一个过滤器或者拦截器
     1.3在其他前置拦截器中从装饰类的request取出复制的数据
3.@Async
如果直接在方法A上同时加上@Async@Transactional注解,注解事务无法生效
如果在方法B中使用了@Async,B中调用了C,D。C/D分别使用事务注解,事务可以生效,注意:B和CD需要在两个service
中,因为事务直接是通过AOP即最终是从代理类中添加事务代码,如果在一个类中,事务注解不会生效
4.steam
在用steam做元素收集时(从对象中收集属性或者从map中收集key、values)时,类型要做显示转换,否则上下文推断会出问题,比如把long型推断为String类型,使用时报错
5.在使用列表时需要主要Arrays.asList()方法,该方法本质返回为arrays类中的一个内部实现类实际引用是一个数组,并不是一个新的对象。