自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

未来,在于当下的学习。

共同进步,相互学习。

  • 博客(43)
  • 资源 (1)
  • 收藏
  • 关注

转载 mybaties plus 高级用法

一主一从补充 :这里面因为默认使用的是HikariCP数据源,目前也推荐使用这个,相比于druid有更高的性能,但是不能忽略下面的配置,否则服务会不断抛出异常,原因是数据库的连接时常和连接池的配置没有做好。

2022-11-03 17:54:17 483 1

原创 Ok-HttpUtil

【代码】Ok-HttpUtil。

2022-11-02 10:49:19 221

原创 接口防止重复提交

2、原理:记录用户Token,接口名,请求参数 使用Hash算法压缩拼接 字符串防止生成的redis key过长。

2022-10-24 15:45:44 394

原创 Mybatis SelectOne返回多个结果

【代码】Mybatis SelectOne返回多个结果。

2022-10-24 15:40:27 1529

原创 mybaties plus 批量插入方案推荐

并且,查阅相关资料可知,values的增长与所需的解析时间,是呈指数型增长的。所以,如果非要使用 foreach 的方式来进行批量插入的话,可以考虑减少一条 insert 语句中 values 的个数,最好能达到上面曲线的最底部的值,使速度最快。一般按经验来说,一次性插20~50行数量是比较合适的,时间消耗也能接受。总结一下,如果MyBatis需要进行批量插入,推荐使用 ExecutorType.BATCH 的插入方式,如果非要使用 的插入的话,需要将每次插入的记录控制在 20~50 左右。...

2022-08-30 11:00:32 407

原创 maven清理、service jar 脚本

REPOSITORY_PATH 指定路径。

2022-08-04 10:27:31 163

原创 JSON.parseObject 带泛型告警

JSON.parseObject带泛型告警。

2022-07-29 09:19:10 1121

原创 Caffeine

Gauva和Caffeine的区别

2022-07-12 21:53:28 385

原创 Java 实现对部分MySQL表监听

轻量级监听MySQL

2022-06-07 20:50:12 1714

原创 MySQL大数据表优化——表分区

MySQL大数据表优化表分区

2022-06-07 20:48:18 640

原创 Mysql 优化

mysql 连接等问题

2022-06-07 20:45:14 212

原创 Nginx安装SSL证书

配置Nginx域名与强制路由https

2022-06-07 20:43:27 2833

原创 序列化、监听、自定义注解

自定义注解

2022-06-06 15:32:53 83

原创 模板设计模式与多态

定义接口规范public interface Job { /** * 定义提交任务接口 * @param a 参数 */ void execute(Integer a);}抽象模板方法public class GeneratorTaskBean extends AbstractSimpleJob { @Override protected int selectTasks(String name) { System.ou

2022-04-28 14:44:21 238

原创 Java总的CAS与ABA问题

CAScas全称是 Compare and swap 也就是比较-置换也被称作自旋锁、轻量级锁、乐观锁在我们程序执行的基本步骤是 取值—计算—赋值 三步,如何保证这三步的原子性是并发编程的基础。我们要实现并发程序的原子性就要保证在取值计算赋值操作时,不能有其他线程在同时修改,原子性的基本实现分为三步,例如AtomicInteger的递增计算第一步:取出旧值第二步:计算新值第三步:比较旧值与内存中的值是否相同,相同赋值,不同则自旋继续1.2.3的步骤...

2022-04-15 10:35:13 251

原创 Synchronization 锁

Synchronization 锁基础知识点synchronized 锁信息保存在对象头当中。Monitor Record 是每个线程的私有数据结构,synchronized的锁对象都有一个monitor都会和线程的Monitor Record 关联,同步代码块是通过monitor enter 和monitor exit 实现,monitor enter 会插入到同步代码块的头部,monitorexit 会插入到方法的结尾或者出现异常的地方。当线程执行monitorenter 与对象头的monit

2022-04-15 10:26:45 275

原创 ReetrantLock 锁

公平与非公平公平锁:在获取锁时存在一个队列,后到的线程会自动排在后面,等待前面的线程执行结束后执行。体现一个先来后到的公平性。非公平锁:实现原理和公平锁存在一些区别,在获取锁时会先尝试获取抢占锁,不去排队,抢占成功则直接向下执行,抢占失败也会加入到队列的后面,等待排队。new ReentrantLock();默认是非公平锁。会稍稍提升一点性能。因为减少的入队列和出队的损耗。true为公平锁。lock、unlock、tryLocklock: ReentrantLock 可以设置超时时间,是可重

2022-04-13 21:13:31 744

原创 Java 位运算

位运算基础

2022-04-11 11:28:15 330

原创 List batch 操作切分

批量操作

2022-04-06 16:09:43 504

原创 swagger 导出 docs

# swagger 2.8.0<io.swagger.version>1.5.20</io.swagger.version><swagger2markup.version>1.3.3</swagger2markup.version><!-- swagger生成接口API离线 --><dependency> <groupId>io.github.swagger2markup</groupId>

2022-03-29 17:21:16 388

原创 Java 内存模型

为了更好的理解 Java 是如何实现 按需禁用缓存和编译优化 的,我们首先需要对 Java 的内存模型有一个初步的了解。Java 内存模型主要由以下三部分构成:1 个主内存、n 个线程、n 个工作内存(与线程一一对应),数据就在它们三者之间来回倒腾。那么怎么倒腾呢?靠的是 Java 提供给我们的 8 个原子操作:lock、unlock、read、load、use、assign、store、write,其操作流程示意图如下:一个变量从主内存拷贝到工作内存,再从工作内存同步回主内存的流程为:|主内存|

2022-03-29 14:04:53 2381

原创 Happens-Before 规则& volatile 的实现原理

根据语义,Happens-Before,就是即便是对于不同的线程,前面的操作也应该发生在后面操作的前面,也就是说,Happens-Before 规则保证:前面的操作的结果对后面的操作一定是可见的。Happens-Before 规则本质上是一种顺序约束规范,用来约束编译器的优化行为。就是说,为了执行效率,我们允许编译器的优化行为,但是为了保证程序运行的正确性,我们要求编译器优化后需要满足 Happens-Before 规则。根据类别,我们将 Happens-Before 规则分为了以下 4 类:操作的

2022-03-29 13:56:29 524

原创 上亿级别的数据量,不同的库如何去重

现在数据分析平台需要设计一个跨库数据比对工具,用户excel导入比对规则,每条规则都是比较不同环境下的两个数据库的数据是否匹配每条比对规则就是两个select语句(有可能是复杂多表联合查询),需要逐条去另一个数据库查询是否匹配例:库1 的查询语句 select name,sex from a1库2 的查询语句 select name,sex from a2a1里面有个张三,男 , a2里面也必须要有个张三,男才算匹配用户导入的比对规则可能会有很多条,每张表的记录数据大小

2022-03-22 15:49:01 799

原创 MongoDB高级用法

聚合管道

2022-03-15 17:33:02 1361

原创 rabbitmq消息中间件常见问题和解决方案

面试题中常见的问题:1.如何保证消息不丢失2.处理重复消息3.消息有序性如何保证4.消息堆积处理消息中间核心功能:1.服务解耦2.异步处理3.流量控制如何保证消息不丢失?通常消息中间件核心流程:三个阶段1.生产消息2.存储消息3.消费消息生产消息阶段消息不丢失:生产者发送消息至Broker,需要处理Broker的 响应,不论是同步还是异步发送消息,同步和异步回调都需要做好try-catch,妥善的 处理响应,如果Broker返回写入失败等错误消息,需要重试发送。当多次

2021-11-17 22:14:22 989

原创 java的内存结构

1、JVM内存模型JVM只不过是运行在你系统上的另一个进程而已,JVM也需要内存来完成它的运行时操作。VM本身是硬件的一层软件抽象,在这之上才能够运行Java程序,也才有了我们所吹嘘的平台独立性以及“一次编写,处处运行”Java虚拟机在执行Java程序的过程中会把它说管理的内存划分为若干个不同的数据区域,如下面两图所示:jvm的内容咱简单的可以这样分2、程序计数器程序计数器是一块较小的空间,它可以看作是当前线程所执行的字节码的行号指示器。如果线程执行的是java方法,这个计数器记录的是正

2021-11-16 23:08:51 253

原创 Dubbo和SpringCloud架构设计 有什么区别

一个微服务架构的设计 需要考虑到 通讯协议,服务依赖模式,开始模式,运行模式等等很多方面考虑首先说一下微服务架构微服务架构是互联网很热⻔的话题,是互联网技术发展的必然结果。早期的项目 10年前的项目 大多是 单体项目后来随着项目规模的发展不断裂变将单一应用程序划分成一组小的服务服务之间互相协调 互相配合,为用户提供最终价值虽然微服务架构没有公认的技术标准和规范或者草案但业界已经有一些很有影响力的开源微服务架构框架提供了微服务的关键思路我们先说一下 微服务的主要优势1:降低复杂度 将原来偶合在一起的复

2021-11-11 22:56:39 48

原创 Netty核心原理

Netty 介绍原生 NIO 存在的问题NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。JDK NIO.

2021-11-11 10:25:18 56

原创 RPC框架设计 BIO、NIO、AIO设计原理,NIO细解

Socket网络编程回顾 Socket,套接字就是两台主机之间逻辑连接的端点。TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。Socket是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。Socket整体流程I/O模型I/O 模型简单的理解:就是用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能Java 共支持 3 种网络编程模型/IO 模式:BIO(同步并阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞).

2021-11-11 09:49:32 188

原创 Spring 声明式事务

编程式事务:在业务代码中添加事务控制代码,这样的事务控制机制就叫做编程式事务声明式事务:通过xml或者注解配置的⽅式达到事务控制的⽬的,叫做声明式事务事务的概念事务指逻辑上的⼀组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。从⽽确保了数据的准确与安全。例如:A——B转帐,对应于如下两条sql语句:/*转出账户减钱*/update account set money=money-100 where name=‘a’;/**转⼊账户加钱*/update account set

2021-11-09 22:12:11 44

原创 如何保证缓存和数据库数据的一致性

更新数据时,是先删缓存还是先更新数据库?其实先删除在更新也有线程安全问题无论是先删除,还是先更新数据库都会有问题先删除缓存再更新数据库的方案也存在着线程安全的问题,例如,线程 A 更新缓存,同时,线程 B 读取缓存的数据。可能会出现下面的执行顺序。(1) 线程 A 删除缓存(2) 线程 B 查询缓存,发现缓存中没有想要的数据(3) 线程 B 查询数据库中的旧数据(4) 线程 B 将查询到的旧数据写入缓存(5) 线程 A 将新数据写入数据库此时,就出现了数据库中的数据和缓存中的数据不一致的情况。如

2021-11-09 22:00:23 37

原创 RedisCluster搭建和扩容

https://blog.csdn.net/chuanchengdabing/article/details/10922611516384个槽位(1)如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。如上所述,在消息头中,最占空间的是myslots[CLUSTER_SLOTS/8]。当槽位为65536时,这块的大小是:65536÷8÷1024=8kb因为每秒钟,redis节点需要发送一定数量的ping消息作为心跳包,如果槽位为65536,这个ping消息的消息头太大了,浪费

2021-11-07 11:28:47 87

原创 Spring IOC⾼级特性

lazy-Init 延迟加载Bean的延迟加载(延迟创建)ApplicationContext 容器的默认⾏为是在启动服务器时将所有 singleton bean 提前进⾏实例化。提前实例化意味着作为初始化过程的⼀部分,ApplicationContext 实例会创建并配置所有的singleton bean。⽐如:<bean id="testBean" class="cn.lagou.LazyBean" />该bean默认的设置为:<bean id="testBean" .

2021-11-05 22:48:31 126

原创 自定义IoC&AOP框架思路

IOC解决的问题(1)在没有IOC容器时,我们SSM架构,分层调用时,需要在调用类中new 被调用层的实现类,这造成了类之间耦合在了⼀起,如果说技术架构发⽣⼀些变动,dao 层的实现要使⽤其它技术,或者其他新的实现类改变。需要从新调用其他实现类时,就必须修改源代码,重新编译,面向接口开发的意义将大打折扣。如何实现IOC:考虑使⽤设计模式中的⼯⼚模式解耦合,另外项⽬中往往有很多对象需要实例化,那就在⼯⼚中使⽤反 射技术实例化对象,⼯⼚模式很合适。通过创建bean.xml文件,使用property标签.

2021-11-05 18:20:52 51

原创 Spring 的优势与核心思想

⽅便解耦,简化开发通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。AOP编程的⽀持通过Spring的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP实现的功能可以通过AOP轻松应付。声明式事务的⽀持@Transactional可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活的进⾏事务的管理,提⾼开发效率和质量。⽅.

2021-11-04 18:49:47 76

原创 Java-JDK动态代理(AOP)使用及实现原理分析

cglib是基于继承,属性方法不能用final修饰。扩展了jdk的功能,在spring和mybatis的底层使用的比较多。jdk的动态代理必须要有接口,才能使用,而cglib不需要接口就可以实现动态代理。动态代理的重要类:...

2021-11-04 17:16:16 55

原创 设计模式之构建者模式应用剖析

- Builder模式的定义"将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”,它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范 围,就可以使⽤⼯⼚模式和Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加 复杂的对象的构建,甚⾄只会构建产品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建 成⼀个复杂的对象主要步骤:1、将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件);2、

2021-11-04 00:26:59 51

原创 设计模式之⼯⼚模式

⼯⼚模式在Mybatis中⽐如SqlSessionFactory使⽤的是⼯⼚模式,该⼯⼚没有那么复杂的逻辑,是⼀个简单⼯⼚模式。简单⼯⼚模式(Simple Factory Pattern):⼜称为静态⼯⼚⽅法(Static Factory Method)模式,它属于创建型模式。在简单⼯⼚模式中,可以根据参数的不同返回不同类的实例。简单⼯⼚模式专⻔定义⼀个类来负责创建 其他类的实例,被创建的实例通常都具有共同的⽗类例⼦:⽣产电脑假设有⼀个电脑的代⼯⽣产商,它⽬前已经可以代⼯⽣产联想电脑了,随着业务的

2021-11-04 00:26:18 435

原创 延迟加载源码剖析:

延迟加载就是在需要⽤到数据时才进⾏加载,不需要⽤到数据时就不加载数据。延迟加载也称懒加载。优点:先从单表查询,需要时再从关联表去关联查询,⼤⼤提⾼数据库性能,因为查询单表要⽐关联查询多张表速度要快。缺点:因为只有当需要⽤到数据时,才会进⾏数据库查询,这样在⼤批量数据查询时,因为查询⼯作也要消耗时间,所以可能造成⽤户等待时间变⻓,造成⽤户体验下降。在多表中:⼀对多,多对多:通常情况下采⽤延迟加载⼀对⼀(多对⼀):通常情况下采⽤⽴即加载注意:延迟加载是基于嵌套查询来实现..

2021-11-04 00:25:57 79

原创 ConcurrentHashMap的扩容为什么是2的幂

ConcurrentHashMap的扩容为什么是2的幂之所以是2的幂,在于如下的设计:采用key的hashCode与数组长度n减1的逻辑与,将key映射到数组的某个哈希桶中。hashCode & (n - 1) 中,由于n是2的幂,减1之后可以保证最后几位都是1,只有n的这一位是0。在扩容的时候,根据key的hashCode与n的逻辑与,获取n对应的二进制表示中的1这一位,在hashCode中是1还是0,用于分配该键值对是挂到低位哈希桶中,还是挂到高位哈希桶中。位操作比数学运算

2021-11-04 00:17:58 338

redis集群搭建.doc

redis集群搭建.doc

2021-11-03

空空如也

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

TA关注的人

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