- 博客(13)
- 收藏
- 关注
原创 本地缓存caffeine
说起本地缓存,很多人可能会想到guava,guava是google一些列程序包中一个非常方便好用的本地化缓存实现。在以往项目中有需要本地缓存方案时,我都会用guava来做实现,确实很有效且方便。但前段时间看到Spring官方推荐的本地化缓存实现方案为caffeine,很吃惊不是guava,考虑到caffeine是Spring官方推荐的,应该是有其独到之处。性能从上图可看出caffeine的性能是非常出色的,具体可参见官方文档caffeine官方文档入手实践1、首先在项目中引入jar包:<
2020-12-15 21:04:09 482
原创 慢SQL优化-索引优化
在项目开发的时候难免会写一些SQL语句,刚开始数据量比较小或没预料到数据的增长速度很快,在后期的维护中偶尔会有慢SQL出现,严重的会影响到线上服务正常运行和用户体验。当然慢SQL的优化角度有多种,比如增/减索引、调整搜索条件的顺序、优化查询结果参数、分库分表、读写分离等等,但本篇我们主要谈一下索引优化的方法和套路。建立索引是数据库查询优化的最重要手段之一,当我们遇到慢SQL情况时,应当优先考虑和分析是不是可以通过优化数据库表的索引结构来解决问题;这里我们假设表1中有一个联合索引(idx_A_B_C),该
2020-11-16 21:02:32 457
原创 Spring中@NotNull、@NotEmpty、@NotBlank和@PositiveOrZero等注解的使用
我们在做web项目的时候经常会遇到前端传参的情况,这会需要对参数做校验,比如参数不能为空,集合不能为空等校验,javax.validation.constraints为我们提供了很多注解来帮忙我们做参数校验。1、 @NotNullThe annotated element must not be {@code null}.校验参数一定不能为null,但是可以为" "。2、 @NotEmptyThe annotated element must not be {@code null} nor
2020-08-06 17:11:40 12448 2
原创 批量insertOrUpdate或replace-into使用useGeneratedKeys报错简单分析
在项目中我们经常使用useGenerateKeys来返回自增主键,避免多一次查询。在项目中不管是单条数据插入还是批量数据插入,用此方法获取自增主键ID屡试不爽。当然也会使用on duplicate key update,来进行insertOrUpdate,来避免必须先query后才觉得是insert还是update。这招用起来很爽,但是也容易不知所以的掉坑,鄙人在一次批量更新的时候使用到了useGenerateKeys导致项目保错,促使我要研究一下使用useGenerateKeys的内部原理和使用奥秘。现
2020-07-28 09:53:10 5175
原创 总结使用Mybatis-generator遇到的坑
在项目开发的时候,习惯于先定义数据库表,给表字段写好注释,方便自己也方便他人。因为使用Mybatis的话,dao、domain、xml等文件基本上没有逻辑,都是基本的数据库操作语句,也就不想自己手写了(太费劲,也容易出错,想想一个包括20多个字段的表。。。),因此想到使用自动化插件来帮助放飞自我使用Mybatis-generator插件的方法网上都有,随便一搜就可以看到。它包括如下几个模块:1、在欲使用Mybatis-generator插件的功能模块的pom.xml中加入以下配置:&l
2020-07-14 18:59:20 9629
原创 Mysql索引规范学习
使用索引优点有效缩短数据的检索时间;加快表与表之间的连接;建立索引的列可以保证行的唯一性;使用索引缺点创建和维护索引需要时间成本,随着表数据量的增大而增大;创建和维护索引需要空间成本,随着表数据量的增大而增大;会降低表的增删改的效率,因为每次数据的增删改都会进行索引的动态维护,导致时间变长;表加索引的原则数据库表数据量很大,查询时需要索引加快搜索速度;多表联合查询的约束字段需要加索引;需要排序(如创建/变更时间倒叙)和分组的字段需加索引;表字段索引的原则越小的字段类型
2020-07-02 14:24:52 852
原创 线程池ThreadPool和ForkJoinPool学习
一、线程池技术一个线程池包括以下四个基本组成部分:ThreadPool(线程池管理器):用于创建并管理线程池;PoolWorker(工作线程):线程池中的线程,没有任务时处于等待状态;可以循环执行任务;Task(任务接口):每个任务必须实现的接口,以便工作线程调度任务的执行;taskQueue(任务队列):用于存放处于等待的工作线程任务;二、ForkJoinPoolForkJoinPool是JDK7引入的线程池。它的核心思想是将大任务分解成多个小任务(fork),由线程池分别执行每个小任务
2020-06-23 20:24:33 1132
原创 “第一性原理”学习摘要
著名人物张首晟、埃隆·马斯克一些解读例子1、人类看到鸟儿在天上飞,就有了飞翔的梦想,千百年来,人们做出了无数努力去模仿鸟儿,希望能够在天空自由飞翔,但都失败了。直到近代人们发现了飞行的第一性原理 - 空气动力学,利用数学公式和数学原理造出了飞机等现代飞行器,这些飞行器不像鸟儿,但是比鸟儿飞的更高、飞的更远;2、马斯克在不同的商业领域都非常成功(Zip2、Paypal的前身、spaceX、tesla、solarCity),但他没有针对不同的领域提炼不同的方法论,而是把同一种底层思维应用到不同的领域–第
2020-06-19 10:34:10 1603 1
原创 dubbo接口中时间类参数格式
在项目中第二次遇到根据时间段来做一个业务逻辑处理,这种情况下dubbo接口入参一般会有一个Date时间类。由于要测试接口的健壮性,往往需要本地调试接口,小菜我上次就是一时没弄明白本地调用接口的时间入参格式,最后使用的时间戳类型参数,被同事嘲笑了一把。 借此机会学习一下dubbo的时间类参数格式该如何设置: 首先,看一下如果使用不合法的时间格式会报错,错误的大体如下:cause: java.lang.IllegalStateException: Failed to parse d
2020-06-19 10:15:40 3652
原创 如何跨项目使用SPI扩展点
SPI-服务扩展点可以使得项目结构更加解耦,比如我司在支付方式模块中,全平台都可以使用在线支付,单由于业务场景要求,不同的业务实例会有定制化的支付方式,如非国有性质的采购人可以申请使用账期支付等。原先的技术实现是有订单模块代码中根据业务实例写死一堆的if-else业务实现,随着接入业务的增加,代码变得越来越臃肿和不可维护。为了该模块更具扩展性和易维护性,我们希望通过由订单中心提供支付方式SPI扩展接口,不同的业务线可以更灵活的配置各自的支付方式。 在一个项目中定义一个扩展接口,然后写不同的实
2020-06-19 10:13:22 1354
原创 数据库分页查询优化
我们在项目中经常会使用到分页查询,之前最常用from-size模式,即“select * from tableName where is_del = 0 limit #{from},#{size} ”,刚开始数据量比较小的情况下还没看出有什么缺点,但是当数据量为百万、千万级别以上数据时,会发现分页查询越来越慢,会严重影响前端页面的反映速度。 ...
2020-04-17 16:12:08 1019
原创 Java项目生成唯一有序的编号-使用redis
项目中有种场景需要生成唯一、有序、自增编号,因为项目是分布式部署,这使得编号的生成有点麻烦。最后在同事的建议下使用Redis的Hincrby方法来简洁有效的解决这种问题。public String generateProtocolNo(String districtCode) { try { String year = String.value...
2020-04-16 16:08:15 3216
原创 Java项目数据迁移怎么做的
Java项目数据迁移怎么做的?1、订单表到履约表找字段映射,即两个不同库表先做好数据字段的对应和补齐;2、代码程序(java)做功能,从一个数据库表中读出数据,然后写到另一个数据库表中;技术历练点多线程;使用线程池:确定核心线程池的数量;使用多线程后,怎么精确确定迁移任务结束时间;使用原子类:AtomicInteger; java Future<?>...
2020-04-16 11:41:56 5775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人