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()获取参数。