编辑
2022-12-13
学习记录
00

线程池:三大方法、七大参数、四种拒绝策略😆

池化技术

  • 程序的运行,本质:占用系统的资源! 优化资源的使用!=>池化技术 线程池、连接池、内存池、对象池///..... 创建、销毁。十分浪费资源 池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。
  • 线程池的好处:
    • 1、降低资源的消耗
    • 2、提高响应的速度
    • 3、方便管理。
    • 线程复用、可以控制最大并发数、管理线程

三大方法

创建线程最好不要用executors去创建,而使用ThreadPoolExecutors创建,executors返回的线程池创建线程数和最大队列是int的最大值,可能会堆积大量的请求和线程导致oom

public class Demo01 { public static void main(String[] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor();// 单个线程 // ExecutorService threadPool = Executors.newFixedThreadPool(5); // 创建一个固定的线程池的大小 // ExecutorService threadPool = Executors.newCachedThreadPool(); // 可伸缩的,遇强则强,遇弱则弱 try { for (int i = 0; i < 100; i++) { // 使用了线程池之后,使用线程池来创建线程 threadPool.execute(() -> { System.out.println(Thread.currentThread().getName() + " ok"); }); } } catch (Exception e) { e.printStackTrace(); } finally { // 线程池用完,程序结束,关闭线程池 threadPool.shutdown(); } } }
编辑
2022-12-02
学习记录
00

众所周知Oracle数据库中没用Limit关键字,那我们要实现返回某条数据怎么办呢,就之内采用Rownum关键字

比如现在我要升序排列,返回最后一条数据 如果是mysql的话就可以这样写

select t.* from emr_mrhp.mrhp_log_message t where t.app_no='MRHP_HOME' and t.inp_visit_id='R10005901' order by t.create_date desc limit 1;

在oracle可以先查出排好序的列表,当成一个新表,再通过rownum来限制,如

select * from (select t.* from emr_mrhp.mrhp_log_message t where t.app_no='MRHP_HOME' and t.inp_visit_id='R10005901' order by t.create_date desc) where rownum=1;

这样就实现同样的效果

编辑
2022-11-29
学习记录
00

工作中经常使用到对于对象、列表、字符串为空的验证,这次查看一下Objectutils.isEmpty()判断逻辑

先上代码

public static boolean isEmpty(@Nullable Object obj) { if (obj == null) { return true; } else if (obj instanceof Optional) { return !((Optional)obj).isPresent(); } else if (obj instanceof CharSequence) { return ((CharSequence)obj).length() == 0; } else if (obj.getClass().isArray()) { return Array.getLength(obj) == 0; } else if (obj instanceof Collection) { return ((Collection)obj).isEmpty(); } else { return obj instanceof Map ? ((Map)obj).isEmpty() : false; } }

首先允许为空 第二步,然后判断是否为空optional ,这个类可以作为null的容器,调用isPresent判断是否为空 第三步,判断是否为字符序列,如果为字符序列则判断长度是否大于零 第四步通过反射判断是否为array,如果是array则判断长度大于零 第五步判断是否为collection类,如果是则调用collection判断为空方法 第六步判断是否为map类 ,为map类则调用为空方法

对map、list、对象为空判断较好,但是字符串就比较差了,空字符串是不算null的, 可以采用StringUils工具类来判断

编辑
2022-11-23
实用工具
00

1. Hibernate Validator 简介

平时项目中,难免需要对参数 进行一些参数正确性的校验,这些校验出现在业务代码中,让我们的业务代码显得臃肿,而且,频繁的编写这类参数校验代码很无聊。鉴于此,觉得 Hibernate Validator 框架刚好解决了这些问题,可以很优雅的方式实现参数的校验,让业务代码 和 校验逻辑 分开,不再编写重复的校验逻辑。 Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。 Bean Validation 为 JavaBean 验证定义了相应的元数据模型和API。缺省的元数据是 Java Annotations,通过使用 XML 可以对原有的元数据信息进行覆盖和扩展。Bean Validation 是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。

2. Hibernate Validator 的作用

验证逻辑与业务逻辑之间进行了分离,降低了程序耦合度; 统一且规范的验证方式,无需你再次编写重复的验证代码; 你将更专注于你的业务,将这些繁琐的事情统统丢在一边。

3. Hibernate Validator 的使用

项目中,主要用于接口api 的入参校验和 封装工具类 在代码中校验两种使用方式。

3.1 引入jar包

xml
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.9.Final</version> </dependency>
编辑
2022-11-23
遇到的问题
00

问题是启动Broker遇到错误提示一直启动失败

解决方式修改bin目录下的runserver.cmd, runbroker.cmd

如图:

runserver.cmd

修改前

修改后