自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 Util工具类中将非静态方法改造为静态方法

这里是延迟的思想,工具类静态方法中使用的属性全部改造为静态属性,只是属性值为空,等到bean加载完成后,再延迟赋值,这个延迟是无需担心的,他是在bean初始化完成后执行的。这里使用的是InitializingBean完成延迟赋值的,也可以借助其他的方法,如@PostConstruct注解等。如下是最近写的一个工具类,可以看到工具类提供的getNewAccessToken()方法为非静态方法,如果加了static会报错,因为这里使用到了redisTemplateInstance实例bean了,

2024-07-30 17:18:44 183

原创 给springboot项目yaml配置属性加密

yaml属性中有些配置属性比较敏感,如数据库密码等,使用jasypt的加密功能可以对yaml中的属性加密,项目启动后自动解密将明文注入到对应的bean中。

2024-07-24 14:51:32 383

原创 kafka集群搭建-使用zookeeper

去官网下载,或者使用如下仓库地址下载,本次使用的时kafka_2.13-3.6.1.tgz ,即3.6.1版本,前面的2.13是scala版本,该版本是较新的版本,可以使用zookeeper,也可以不使用zookeeper搭建集群,本次记录使用了zk,zk集群的部署可以参考上一篇记录。在上面3台服务器上分别执行wget下载,或者本地下载后上传,本次使用的环境为堡垒机接入,如果使用的是宿主机账密登陆,可以下载配置一台,其余使用SCP命令拷贝过去即可。此时可以看到2个消费者模拟客户端都受到了消息:hello。

2024-07-23 16:01:09 711

原创 zookeeper集群搭建

使用如下3台主机搭建zookeeper集群,由于默认的2181客户端连接端口不在本次使用的云服务器开发端口范围内,故端口改为了8092。

2024-07-22 16:22:22 434

原创 MySQL优化

MySQL优化总结:1.查询缓存:相同的查询被执行了多次的时候,查询结果会被放到一个HASH映射缓存中,后续的相同(完全一样,包括空格大小写)的查询就不用操作表而直接访问缓存结果。查询缓存是第一步,在sql语法解析之前,因此可以大大升级性能。查询缓存默认是开启的。如下两种情况会导致不走查询缓存:a. select语句中使用SQL_NO_CACHE强制不走缓存,如:select SQL_NO_CACHE * from table_name where xxxx = yyyyb. 查询中有不确定

2020-06-15 22:18:39 626

原创 MySQL的并发控制MVCC

看下如下2个demo,关闭了自动事务,select和update语句会自动给users表加上S锁(共享锁)和X锁(排它锁)。S锁和X锁是互斥的,按理说先执行的事务未commit或者rollback之前,另一个事务是无法对users表加互斥锁进行操作的,但是这里两个demo却可以正常执行。demo1:transaction1: set session autocommit=off; update users set lastUpdate=now() where id =1;//加x

2020-06-14 15:52:30 327

原创 MySQL的事务和锁学习

一 数据库事务概念1.数据库事务数据库操作的最小单元,是一组不可分割的逻辑操作单元。要么一起成功持久化,要么失败回滚。2.事务的ACID特性原子性(Atomic)最小单元,不可分割了。一致性(Consistency)事务操作的数据及状态是一致的,写入的结果必须要符合预期规则,与会因为系统意外等原因导致状态不一致。隔离性(Isolation)不同事务操作数据之间不可见。持久性(Durability)事务一旦提交,数据更改就会永久保存。3 事务并发带来的问题脏读事务A读到了事务B未提

2020-06-13 22:56:22 244

原创 MySQL执行计划学习

1.explain 的作用工作中需要要写出好的sql或者想要提升sql的查询性能,我们通常的做法是加索引。那么加了索引后,我们如何知道加的索引生效了呢?真正执行每条sql时走的是哪个索引呢?(表字段建了多个索引,单sql执行时只会走一个索引) 索引效率如何呢?这就需要我们查询sql的执行计划,通过执行执行分析性能。不同数据生产厂商提供了不同的执行执行查询语句,如mysql,postgresql的explain ,oracle的explain for。这里学习下mysql的执行计划。2.explain查询

2020-06-13 16:32:58 383

原创 MySQL存储引擎

为了提高数据库查询性能,我们会给表字段加索引,索引又是又是由存储引擎实现的,所以学习下MySQL中的常用的存储引擎是很有必要的。MySQL中常用的存储引擎由MyISAM和InnoDB两种存储引擎。1.MyISAM存储引擎1.1 MySQL5.5之前默认的存储引擎。具有一下特点:a.b.c.1.2 MySQL中B+Tree索引的体现形式如下图,索引和数据行数据分开存储在一个.MYI和一个.MYD的文中。无论是主键上建立的索引,还是主键外的辅助索引,索引过程均为下图:在.MYI文件中根据索引找到地

2020-06-09 15:20:48 127

原创 MySQL索引学习

1.索引是什么?**索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。**索引是由存储引擎实现的,而MySQL的存储引擎是表级的,同一个数据库的不同表可以使用不同的引擎。索引并非越多越好,正确的创建合适的索引是提升数据库查询性能的关键。索引是表索引字段和记录行的物理地址构成。索引和表是分开存储的。索引不宜过多(一般一张表最好不要超过5个索引),一张两千万数据的普通表,几个索引的体积就可以1GB.2.为什么要使用索引?1.索引是极大的减少存储引擎需要扫描的数据量。2.可以把随机IO变

2020-06-08 23:19:18 225

原创 Mybatis源码分析上

1. Mybatis是什么?官方给的定义:MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。mybatis作为一款java开发人员最常用的orm框架,重要性不言而喻。除了会使用mybatis进行基本的CRUD

2020-06-02 21:37:35 145

原创 HashMap学习

部分内容参考自:https://blog.csdn.net/weixin_35586546/article/details/811537931. HashMap结构:HashMap 数据结构为 数组+链表,其中:链表的节点存储的是一个 Entry 对象,每个Entry 对象存储四个属性(hash,key,value,next)1.整体是一个数组;2.数组每个位置是一个链表;3.链表每个节点中的Value即我们存储的Object;2.HashMap类:HashMap容器继承自AbstractM

2020-05-19 23:09:17 179

原创 多线程之AQS学习

多线程并发访问共享资源时,为了保证数据的安全性,我们采用加锁的手段保证多线程访问共享资源的安全(这里不讨论无锁手段)。锁可以大致分为两种----Synchronized锁和基于Lock,AQS的实现锁。AQS是一个抽象队列同步器(Abstract Queued Synchronizer),用来控制多线程对共享资源的同步操作。常见的锁如:ReentrantLock, ReentrantReadWri...

2020-05-12 17:23:21 250

原创 java8时间类API学习

java8引入了全新的时间类API,相比与之前的Date类操作上简化了许多,学习记录下。package com.example.java8.date;import org.junit.Test;import java.time.*;import java.time.format.DateTimeFormatter;import java.time.temporal.ChronoUni...

2020-05-06 22:34:34 208

原创 利用CAS机制写一个简单的tryLock锁

小试牛刀学习了Atomic类的CAS机制后,小试牛刀来写一个简单的tryLock锁,巩固下学习内容。代码如下:package com.example.multithread.atomicmethod;import java.util.concurrent.atomic.AtomicInteger;import java.util.stream.IntStream;public cla...

2020-05-05 13:46:49 232

原创 原子类学习

看一个volatile的例子,代码如下,三个线程对同一个变量做累加。package com.example.multithread.atomicmethod;import java.util.concurrent.atomic.AtomicInteger;import java.util.stream.IntStream;public class AtomicTest { p...

2020-05-04 22:19:57 161

原创 观察者模式

观察者模式:观察者订阅事件源,当事件源状态发生改变时,自动通知订阅的观察者,并触发观察者预定动作。事件源:package com.example.multithread.pattern;import java.util.ArrayList;import java.util.List;/** * 事件源 */public class Subject { int sta...

2020-05-03 21:05:14 124

原创 多线程之volatile

代码一:如下代码开启2个线程,一个只读,一个只写。可以看到写线程虽然改变了共享变量,但是只读线程似乎根本不care变化,输出的变量一直是0。package com.example.multithread.volatiletest;import java.util.stream.IntStream;public class VolatileReadOnly {// priva...

2020-05-03 16:36:26 188

原创 创建线程安全的单例对象

方法一:饿汉式:package com.example.multithread.singleton;import java.util.stream.IntStream;/** * 饿汉式:1.优点:类加载时就自动创建对象,禁止用户创建对象,天然线程安全, * 2.缺点:类加载时jvm会创建静态对象实例,不管后续是否使用到该实例,造成内存浪费。 */public cl...

2020-05-01 17:30:08 325

原创 装饰器模式学习

一、装饰器模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。二、实践2.1 定义一个接口...

2019-12-10 21:59:15 102

原创 模板方法学习

一、模板方法:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。二、实践饭店里面,客人点餐后,后厨烧菜。后厨做菜的整个过程可以认为都是在重复烧菜前准备、烧菜、烧菜后处理这三个步骤,因此我们可以顶一个烧菜的模板,具体的细节延迟到每一道菜做的过程中去实现。2.1 定义烧菜的模板//定义模板,烧菜步骤:烧菜前准备工作、烧菜、...

2019-12-10 20:41:01 172

原创 委派模式学习

一、委派模式:主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色.实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法.委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部, 如Spring的DispatcherServlet.二...

2019-12-09 22:10:29 174

原创 策略模式学习

一、策略模式(Strategy):定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。二、使用场景:1、一个系统有许多类,而区分它们的只是他们直接的行为。2、在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。三、实践3.1 定义策略接口public interface CalculateStrategy { int doCalculate(i...

2019-12-09 21:28:27 96

原创 mybatis学习五之源码分析学习1

一、准备工作,环境搭建1.1 mybatis 配置<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-confi...

2019-11-23 23:01:47 98

原创 mybatis学习四之一级缓存、二级缓存

一级、二级缓存介绍:1、一级缓存1.1 mybatis的一级缓存基于SqlSession级别,默认是开启且无法关闭(但是我们可以手动设置不使用缓存,useCahe,flushCahe参数)。在同一个sqlSession中执行多次一样的查询,可以发现第后续多次查询并没有去查询数据库,而是直接命中了第一次的缓存。一级缓存可以减少数据库压力,但可能会查询到脏数据(第一次查询后数据被修改了)。但是...

2019-11-23 14:36:03 123

原创 mybatis学习三之拦截器学习

代码地址:https://github.com/Gronckler/WorkProject.git这里引用一个项目中的实际案例:用户敏感数据加密后入库,查询出来后自动解密,即数据在库中是以密文方式存在。项目工程仍然沿用前期工程(手动管理数据源方式)。思路:加密入库:自定义注解标注实体类有敏感信息的字段,通过拦截器反射获取到敏感字段后进行加密处理并添加一个特殊前缀,再入库。查询解密:遍历查询...

2019-11-17 15:57:29 191

原创 springboot学习二之之定义typeHandler

项目工程沿用上一次springboot学习一的工程。添加新的测试方法。Controller @PostMapping("/add") public String addUser(@RequestBody User user){ String msg = testService.addUser(user); return msg; }Servi...

2019-11-17 13:47:23 2509

原创 mybatis学习一之springboot整合mybatis及自动与手动管理数据源

一、使用IDEA新建一个springboot项目工程architecture,过程略,建成后结构如下图。本项目依赖坐标如下<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <arti...

2019-11-16 23:04:45 621

原创 mybatis generator学习

1、新建一个module工程generator,专门用于生成mapper.xml,过程略。(不建议和项目工程放在一样,防止新生成文件覆盖老文件)2.引入相关依赖<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId&...

2019-11-12 23:10:07 124

原创 设计模式之原型模式学习

本文参考自:https://www.cnblogs.com/betterboyz/p/9356190.html原型模式的定义与特点原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较...

2019-10-19 20:06:32 107

原创 设计模式之单例模式

文中内容参考摘录自:http://c.biancheng.net/view/1338.html ,仅作学习笔记记录。一、单例模式的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。在计算机系统中...

2019-10-19 17:44:39 101

原创 maven父工程报错pom.xml不存在

今天在使用IDEA构建maven工程时报了一个父工程的pom.xml不存在的错误。[ERROR] Some problems were encountered while processing the POMs:Child module G:\springcloud\parent\department of G:\springcloud\parent\pom.xml does not exi...

2019-10-16 20:58:16 1230

原创 使用IDEA创建一个简单的maven聚合工程

idea中创建maven聚合工程和eclipse中有所不同,今天花时间学习了一下如何使用idea创建一个maven工程,这里记录一下。1、创建父工程parent1.1选择File -> New -> Project1.2 选择maven工程,注意这里骨架不选,下一步。1.3 输入父工程GAV信息1.4 Finish,完成父工程创建。父工程创建后信息如下,这里的sr...

2019-10-15 20:01:02 413

原创 linux命令

1、清空文件内容 可以用于调试时清空日志大文件 cat /dev/null > 1.txt echo "" > 1.txt2、grep 常见用法grep -c 'xxx' 统计 xxx出现的次数(这里的c是小写的c,count的意思)grep -i 'xxXX' 不区分大小写的正则匹配查找grep --color=auto 'xx' 搜索的关键字显示...

2019-10-07 16:29:53 109

原创 jvm 基础知识学习

本文转载借鉴自:https://blog.csdn.net/qq_41701956/article/details/816649211. Java 内存区域与内存溢出异常1.1 运行时数据区域根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。1.1.1 程序计数器内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下...

2019-10-04 14:25:01 256

原创 GC日志学习

1、vm参数设置调整vm的参数,记录gc日志,服务器端可以在catatlina.sh或者catalina.bat(windows)中的JAVA_OPTS中追加如下参数-Xms512m -Xmx1028m -XX:MaxNewSize=512m -XX:MaxPermSize=1028m -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -verbose...

2019-10-04 11:41:56 123

原创 curl命令服务器端测试api接口

curl命令可以用于测试接口,开发中我们可以使用curl命令在nginx或者在应用服务器上检测接口,用于定位问题。简单记录下自己在接口调试中用到的curl场景。1.curl 测试Get类型api如果在nginx上测试,这里localhost:80就是ng的地址端口,如果是在应用服务器上,就是应用服务器的地址和应用的设置的监听端口,加-v参数可以查看详情。curl localhost:80/a...

2019-09-22 18:47:32 3134

原创 springboot之单元测试

1.引入相关依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></d...

2019-09-22 18:24:35 152

原创 springboot整合springmvc之接收前端参数常用方法

1.@PathVariable 用于获取rest请求路径中的参数,并封装到方法的入参中。 1.1 将请路径中的{id}位置的参数风中到getMsg方法的入参id中。 @GetMapping("/get/{id}") public Object getMsg(@PathVariable String id){ return id+"的内容"; } 1.2 ...

2019-09-22 16:04:31 888

原创 springboot读取配置文件的4种方式

配置文件让项目开发、管理、后期维护变得更加的优雅便捷,所以我们有必要学习下常见的springboot读取配置文件的方式。首先新建一个springboot项目,在application.properties配置文件中添加如下属性。com.boot.demo1=springcom.boot.demo2=bootcom.boot.demo3=学习读取方式:方式一:@Value("${xxx...

2019-08-14 23:39:23 4258

tomcat-redis集群,session共享

tomcat-redis集群时session共享jar工具类,支持tomcat8

2018-07-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除