分布式锁,处理的问题,impala,视图,接口转https,spring,mybatis,IOC,DI,AOP,自动装配,@Requestbody

mybatis批量更新,连接信息一定要加上allowMultiQueries=true

19,分布式锁

之前有讲过redis的分布式锁,现在讲下mysql的分布式锁。分乐观锁和悲观锁。

乐观锁,就是加个version字段设置为0,在对要操作的数据将这条数据update set version=version+1  where version=0如果返回ture,表示这条数据没有被其他线程操作。那就被当前线程操作。如果返回false,表示这条数据正在被其他线程上锁,那当前线程就return,停止后续操作。此外可以再加一个时间字段,在对version加1的同时更新时间,用来判断锁的过期时间。

悲观锁,不适合做分布式锁。就是使用for update ,再结合事务。如spring的@Transcational  让查询和更新在一个事务中,别的线程不能查找和操作目标数据。常在更新某个字段中使用。

redis做分布式锁优势,适合高并发,使用方便,可设置过期时间,常做颗粒度较大的方法块级别的锁。redis解锁的时候要先判断id是否一致,否则可能把别的线程的锁给解了。

个人理解优缺点。比较倾向于使乐观锁。因为相对于悲观锁,它的操作更方便,不影响性能,即使锁不释放,那只要改下数据值即可。相对于redis,颗粒度更小,行锁。不过网上都说高并发下不适用,也没有太多研究。

20,处理的问题。

原因,现网有同一个任务,定时任务多次发送。

处理,发现定时任务没有加锁,多个机器节点都执行了。

原因2,token一直提示过期

处理,发现服务器时间落后与正常时间五分多钟。

21,接入es

可视化工具,kibana

异步批量存储,超过200条或大于2分钟保存一次。

22, try(对象) catch 新写法

对象要实现 AutoCloseable接口。这样在出现异常时,可以自动调用close方法,不使用finally。确保资源对象关闭流对象或必须要执行的收尾方法。

23,脚本curl命令测试连通性。

写shell脚本要注意空格,等号两边没有空格。

#! /bin/bash 声明这是个shell脚本

host="bai.du"

#测试ping连通性

if ping -c 1 $host  > /dev/null; then

  echo ""

else

  echo ""

fi

#测试服务连通性

http_status=$(curl -s -o /dev/null -w "%{http_code}" http://$host)

if ["$http_status" -eq 200]; then

  echo ""

else

  echo ""

fi

24,web项目的菜单项的接口url地址不能随便乱起。因为要根据菜单地址设置用户权限。

25,mybatis更新时可以加上一个默认更新主键的操作。防止所有的更新字段都是空值,引发sql错误。

26,请求https服务时,用httpclient要绕过ssl验证。但这里的服务端不少强制要求证书。

27,上传未知版本号的三方jar包到私服。

mvn install:install-file "-DgroupId=com.cloudera" "-DartifactId=ImpalaJDBC41" "-Dversion=2.6.30" "-Dpackaging=jar" "-Dfile=ImpalaJDBC41.jar"

28,impala注意点

impala交互式实时查询分析工具,非数据库,支持bp级别数据量查询,依赖hive,基于内存,中间过程不用重启,树状分段式并行处理,c语言编写更接近底层。

impala不能自动感知hive改变,需要手动执行命令拉取hive数据。

impala集群原理,使用statestore监控节点健康状况,每个节点都具有生成查询计划、协调管理节点、执行引擎的功能。

impala通过catalog操作hive metastore

执行过程,jdbc,指定impala节点,到hive拉取表的元数据信息,再找到源数据在hdfs的存储节点。生成执行计划,分发计划,执行计划,节点间数据交换,执行结果汇报到协调器,计算汇总结果,返回客户端。

29,springboot项目接口转https

,利用jdk生成keystore证书,在application.xml中配置证书路径、密码、证书类型等即可。

服务端提供证书验证功能,但是是非强制验证的,客户端是可以绕过ssl认证的。

客户端绕过ssl认证原理:接受收对服务器传来的信息,做创建X509TrustManager信任管理器对象,并重写其中的三个方法,不做任何处理,也就是信任所有证书。

客户端带ssl认证过程:也是在sslcontext添加密钥管理器,和证书管理器。证书和密钥都要服务端提供。

30,mysql视图真实使用场景

有一个跟原表一样的临时表,数据是不稳定的,需要完善。所以不能影响到原表。但是有些查询也需要兼容两张表的内容。所以使用视图。

31,处理二方包不能引入问题和不能传递依赖的问题

把别人给的jar包放到本地私仓后,发现项目还是引入不了。原因可能是直接放的jar包不包含pom文件,或者文件不对,导致两边不能很好的匹配。这时候。这时候需要使用 mvn install:install-file -Dfile=包名.jar -DgroupId=? -Dartifacted=? -Dversion=? -Dpackaging=jar 命令把本地的包上传到本地仓库,仓库地址是在maven的setting中配置的,这时候会生成pom.xml文件。(这个命令是要在cmd中执行,待上传的文件随便在什么目录,cmd时需要先进入到这个文件所在的目录执行。)

不能依赖传递,我遇到的情况是因为,如果是把别人给的jar包直接放到本地私仓,项目是不能把这个jar包中pom依赖的其他包传递的拉下来。解决办法还是要能连到远程仓库,所有的包都从远仓上拉就可以了。

32,新建个settings文件。

在maven自带的settings基础上(此时基本所有标签内容都是被注释掉的)。第一,配置本地仓库地址标签<localRepository>。第二,直接配置<profiles>标签,好像这里面的标签优先级最高,跟其他的有冲突也会优先使用。然后百度下,配一下jdk1.8。最重要的是加一个<repositories><repositories>再配id和name标签,内容随便写,最重要是要配个远仓的url<url>。

这样setting就配好了,这是远仓不需要检验用户密码,很省事连远程mirror镜像都不需要配。如果了解远仓需要账户密码,那就要另外再加配置了。

33, spring 和springboot的关系。

springboot继承自spring,所有都具有aop ioc两大核心功能。二者目的都是简化开发配置。

不同点,springboot 采用“约定大于配置”进一步简化spring配置,内置了服务器,还有一堆的starter包,自带如连接池等功能,也解决了jar间的版本冲突问题,使开发上手很简单。

34,springboot自动装配

要对比没有使用自动装配而言。依然是约定大于配置。我们需要某个功能就引入对应的starter包,在默认情况下不需要做任何配置就能使用。如使用redis,引入他的starter包会默认连接本地redis,启动就能直接用了。

原理就是启动类有个springbootapplication注解,里面有个enableautoconfiguration注解,这里面又通过@import引入个选择器类,里面有个selectimport方法,这个方法会扫描所有包下面的meta~inf/spring.factories文件,这个文件里面有许多类路径,就都是可能需要加载的bean。注意不是全部加载,而且能找到相应的类才会加载。

既然如此,我们也可以在自己项目的spring.factories文件中自定义个性化bean.

总之,自动装配的目的也是简化开发成本。省去之前需要在xml中的许多配置。

35,mybatis加载

先对标jdbc的流程:1,加载驱动,2创建连接,3preparestatement预编译sql,4执行sql,5,返回结果集,6,关闭连接

mybatis 大致流程:加载mybatis-config和mapper.xml配置文件,根据配置文件生成sqlsessionfactory,sqlsessionfactory的作用是连接数据库和创建sqlsession。sqlsession负责连接一次连接数据的会话。接着是executor执行sql,这个过程主要有statementHandler 接收参数,格式化sql,与数据库交互,并返回映射结果输出集。

这里jdbc的一二部操作由sqlsessionfactory完成,preparestatement实在statementhandler完成。

怎么找mapper?即mapper接口怎么和sql文件绑定的。首先mapper.xml文件在项目启动时就加载config配置文件并生成一个configration对象管理mybatis所有配置。接着就是解析mapper.xml文件了,这里肯定涉及到document解析了。最终会在configuration对象的MapperRegistry属性内调用addMapper方法添加一个动态代理的mapperproxy代理类,这里主要其作用的是xml中namespace。使用的时候可以通过接口类型动态的调用到对应的方法。

怎么sql方法和执行sql的? 这里就是用上面生成的代理类,会构造一个mapperMethod对象,这里面封装了sql语句和mapper接口中的方法信息。并且有excector方法执行sql.

当前还有参数映射,结果集映射,太复杂不研究了。

一级缓存:同一个sql键的缓存,相同的查询就不二次查了。默认开启

二级缓存:同一个namespace间的缓存。需要手动开启

37,索引的作用是避免全文索引

38,重新理解IOC,DI

前者是控制反转,就是把new的操作,交给了第三方beanfactory去创建。控制反转消除了new的操作。接着是对象间的依赖关系,也就是set操作。我们要做的就是把这一步也交给beanfactory处理。消除我们显示的set操作。

39,cpu使用率高怎么排查

top命令看下,cpu高是计算密集型,可能是线程多,死循环等,一般排查下日志就可以了。

40,@requestbody

在一个接口中只能使用一个,而且必须要是json格式。

可以和@requestparam结合使用,传递多个参数。

可以使用x-www-form-urlencoded格式传输,不受局限,可通过 getparamter()获取参数。

39,@PostMapping(“/**”) url支持使用**通配符 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老马识途2.0

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

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

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

打赏作者

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

抵扣说明:

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

余额充值