2021-8-17
在git命令状态下 mvn clean install --settings D:\work_app\apache-maven-3.8.1\conf\settings-gennlife.xml -U -X
依赖拉不下来的解决方式。
-U 强制去远程更新snapshot(快照)的插件或依赖,默认每天只更新一次。
X 显示maven允许的debug信息
2021-8-18
git常用命令:
2021-8-19
linux 装Dgraph的版本号 docker pull dgraph/dgraph:v20.11.3
2021-8-25
1.用于查看指定端口号的进程情况,netstat -tunlp | grep 端口号
查看程序端口占用情况 netstat -apn | grep 8005
Maven中-DskipTests和-Dmaven.test.skip=true的区别
2.在使用mvn package进行编译、打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip=true,这两个参数的主要区别是:
-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
3.用ps 查找进程ps -ef | grep mq
4.nohup /root/runoob.sh > runoob.log 2>&1 &
2>&1 解释:
将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
5.springboot @CreationTimestamp 自动生成时间戳
2021-8-27
一、在linux环境下配置 jdk、tomcat、maven
1.vi /etc/profile
进入profile 文件
export JAVA_HOME=/opt/jdk1.8.0_191
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
PATH=/opt/mysql8.0/bin:/opt/mysql8.0/lib:$PATH
export PATH
MAVEN_HOME=/opt/apache-maven-3.8.1
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
2.保存退出
3.进入etc 下 执行
source /etc/profile
保存配置
二、在linux下安装nginx
linux版本:CentOS7 64位
【yum 安装最新版nginx:https://www.cnblogs.com/xxoome/p/7256214.html】
在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。
安装命令:
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
nginx下载地址:https://nginx.org/download/
下载“nginx-1.9.9.tar.gz”,移动到/opt下。
解压
tar -zxvf nginx-1.9.9.tar.gz
进入nginx目录
cd nginx-1.9.9
配置
./configure --prefix=/usr/local/nginx
make
make install
OK,现在可以执行make 了。
执行make、make install命令
测试是否安装成功
cd到刚才配置的安装目录/opt/nginx/
./sbin/nginx -t
正常情况的信息输出:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test
is successful
启动nginx
cd /opt/nginx/sbin
./nginx //启动nginx
2、配置nginx开机自启动
vim /etc/rc.d/rc.local
2021-8-30
1.常用的isNotEmpty和isNotBlank;这两个都是判断string 是否为空,不过isNotBlank要求更严,空格和“制表符、换行符、换页符和回车符”均识为空白符;
具体内容如下:
//判断某字符串是否非空
System.out.println(StringUtils.isNotEmpty(null));//false
System.out.println(StringUtils.isNotEmpty(""));// false
System.out.println(StringUtils.isNotEmpty(" "));// true
System.out.println(StringUtils.isNotEmpty("\t \n \f \r"));// true
System.out.println(StringUtils.isNotEmpty("sb"));// true
System.out.println(StringUtils.isNotBlank(null));// false
System.out.println(StringUtils.isNotBlank(""));// false
System.out.println(StringUtils.isNotBlank(" "));//false
//对于制表符、换行符、换页符和回车符StringUtils.isBlank()均识为空白符
System.out.println(StringUtils.isNotBlank("\t \n \f \r"));// false
System.out.println(StringUtils.isNotBlank("sb"));// true
2.isEmpty与isBlank区别
isEmpty 判断某字符串是否为空,为空的标准是 str==null或 str.length()==0
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false(//注意在 StringUtils 中空格作非空处理(单空格))
StringUtils.isEmpty(" ") = false (//多空格)
StringUtils.isEmpty("asd") = false
StringUtils.isEmpty(" asd ") = false
isBlank 判断某字符串是否为空或长度为0或由空白符(whitespace) 构成
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true(//注意与isEmpty最大区别,(单空格))
StringUtils.isBlank(" ") = true (//注意与isEmpty最大区别,(多空格))
StringUtils.isBlank("\t \n \f \r") = true //对于制表符、换行符、换页符和回车符 StringUtils.isBlank() //均识为空白符
StringUtils.isBlank("\b") = false //"\b"为单词边界符
StringUtils.isBlank("asd") = false
StringUtils.isBlank(" asd ") = false
3.在做删除的时候使用 StringUtils.isNotBlank(id)来判断id是否为空
@ApiOperation(value = "删除")
@PostMapping("/remove")
public Result doRemove(@RequestParam String mulitId) {
if (StringUtils.isNotBlank(mulitId)) {
apiPermService.deletes(mulitId);
}
return Result.buildSuccess();
}
4.栈溢出的原因
一)、是否有递归调用
二)、是否有大量循环或死循环
三)、全局变量是否过多
四)、 数组、List、map数据是否过大
5.OOM --> java.lang.OutOfMemoryError
5.1 为什么会OOM?
为什么会没有内存了呢?原因不外乎有两点:
1)分配的少了:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
2)应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。
内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。
最常见的OOM情况有以下三种:
1.java.lang.OutOfMemoryError: Java heap space ------>java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
2.java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
3.java.lang.StackOverflowError ------> 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
2021-8-31
1.流程:前端使用Ajax发送post 请求到后端SpringBoot,后端接受到数据之后发现多了一个 =
前端使用Ajax发送数据设置数据的传输格式dataType,但是在发送http请求的时候contentType没有设置,默认是为application/x-www-form-urlencoded;charset=UTF-8
,这种数据结构是一种 键值对 数据结构,在传输的时候将 json 当成了键 加了一个等号 值为空 所以传输到后端 会多出来一个 等号
var postURL = "你的URL地址";
$.ajax({
url: postURL,
data:encodeURIComponent(JSON.stringify(data.field)),//为了防止乱码 将json数据 编码后发送到后端
type:"post",
contentType: "application/json;charset=UTF-8", //指定请求头 contentType 即可解决
dataType:"application/json;charset=UTF-8",//设置数据格式 一定要设置 不然传输json数据 会出问题
success:function(data){
//do somethings
}
后端也做一些修改 与 前端对应
//加入 produce 指定接收的数据的格式
@PostMapping(value = "/xxx",produces = "application/json;charset=UTF-8")
@ResponseBody
public String xxx(@RequestBody String params){
//do somethings
}
重启项目 再次发送数据 后端成功拿到正确json 解决了 发送数据 多出=问题。
2.行存储和列存储的区别:
行式数据库的特性如下:
传统的关系型数据库
①数据是按行存储的。
②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。
③建立索引和物化视图需要花费大量的时间和资源。
④面对查询需求,数据库必须被大量膨胀才能满足需求。
行式存储的适用场景:
1、适合随机的增删改查操作;
2、需要在行中选取所有属性的查询操作;
3、需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。
列式数据库的特性如下:
列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础的逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。
①数据按列存储,即每一列单独存放。
②数据即索引。
③只访问查询涉及的列,可以大量降低系统I/O。
④每一列由一个线程来处理,即查询的并发处理性能高。
⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。
3.List集合转换String,两种比较好用的处理方式
3.1.采用java8 String.join 字符串拼接
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("1");
a.add("2");
//Optional.of(a).orElseThrow(() -> new RuntimeException("a is null"));
String join = String.join(",", a);
System.out.println(join);
}
3. 2.采用guava的Joiner字符串拼接
String join = Joiner.on(",").join(list);
2021-9-2
LoggerFactory.getLogger用法
java开发过程中经常需要打印日志信息,往往会在每个类的第一行加上形如以下代码:
protected static final Logger logger = LoggerFactory.getLogger(XXX.class);
目的:使用指定的类XXX初始化日志对象,方便在日志输出的时候,可以打印出日志信息所属的类。
示例:protected static final Logger logger = LoggerFactory.getLogger(abc.class);
logger.debug("hello world");
输出:abc:hello world
优点:使用指定类初始化日志对象,在日志输出的时候,可以打印出日志信息所在类
logger日志的几个方法
logger.debug、logger.info、logger.warn、logger.error、logger.fatal 的区别:
相同处:
它们的作用都是把错误信息写到文本日志里
不同的是它们表示的日志级别不同:
日志级别由高到底是:fatal -> error -> warn -> info -> debug,低级别的会输出高级别的信息,高级别的不会输出低级别的
信息,如等级设为Error的话,warn,info,debug的信息不会输出
修改日志输出的级别要在log4j文件中进行配置
项目正式发布后,一般会把日志级别设置为fatal或者error
2021-9-27
java类中serialVersionUID的作用
serialVersionUID适用于java序列化机制。
简单来说,JAVA序列化的机制是通过 判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastException。
具体序列化的过程是这样的:
序列化操作时会把系统当前类的serialVersionUID写入到序列化文件中,当反序列化时系统会自动检测文件中的serialVersionUID,判断它是否与当前类中的serialVersionUID一致。如果一致说明序列化文件的版本与当前类的版本是一样的,可以反序列化成功,否则就失败;