stream流判断列表中有多少重复数据
Map<Object,Long> map= list.stream().collect(Collectors.groupingBy(item->item,Collectors.counting()));
map.forEach((k,v)-> System.out.println(k+":"+v));
Redis的差值比较
sdiff 注意时间的格式、数据类型、数据精度的变化。
- mysql使用ENCODE/DECODE加密/解密的方式处理数据,在数据库中存放的时候以blob类型存储,但是我们通过mybatis-generator自动生成mapper和po操作数据库的时候,切记要注意blob对应生成的字段是byte[]类型的。我们最好自定义一个po将byte[]类型的字段改为string类型进行加密解密操作,不要直接使用byte[]类型,否则加密解密会有问题,最终造成差集比较出现问题。
NPE问题是什么问题
空指针异常
- 返回参数不要写成null,返回空的List可以使用Collections.emptyList()返回一个空的列表。
- 使用Spring注解@NonNull 不允许传入空值,@Nullable 可以传入空值
- Optional的isPresent或者ifPresent规避空指针异常
- Objects.nonNull() 可以判断是否为null 返回一个boolean值
数据库的逻辑分页和物理分页
- 物理分页是数据库本身支持的分页方式,比如mysql的limit;oracle的rownum eg:SELECT rownum patient_id,patient_id,vital_signs FROM VITAL_SIGNS_REC where rownum <5;
- 逻辑分页是将数据库数据全量查出以后使用代码处理
静态导入
静态导入,即在原来import 和导入的包之间加入static关键字,我们原来需要通过实例名.方法名()的地方全部可以直接写为方法名()。
了解定时任务
定时任务,springboot中使用@Scheduled注解的类,在指定的时间点去执行被注解类的代码。可以单线程执行,也可以多线程执行定时任务。springboot默认的线程池大小为1。在执行多任务调度的时候可以使用自定义调度器(定时任务)两种方式,
其一:使用@Bean直接返回一个TaskScheduler ,
其二:使用@Configuration实现SchedulingConfigurer重写里面的方法。
两种实现具体需要参考
@Async任务异步执行。主要用于方法上,表示当前方法会使用新线程异步执行。springboot默认执行器线程池的大小为100.当两种注解同时使用的时候@Scheduled将不再使用自己的线程池执行器,而使用@Async的异步执行器的线程池。
tomcat连接数越大,mysql连接池也越大并发越大对吗?
- 分配给JVM的内存多点,在提高性能的同时,也会加重GC的负担
- 硬件配置
- 操作系统对进程中的线程数有一些限制:
windows 每个进程不允许超过2000
linux每个进程中线程数不允许超过1000
在Java中每开启一个线程需要消耗1MB的jvm内存空间作为线程栈之用。 - Tomcat的最大并发数可以配置,在实际中最大并发数与硬件新能和CPU数量都有关系。
- tomcat默认的http实现采用的阻塞式socket通信,每个请求都需要创建一个线程处理。这种模式下的并发量受到线程数的限制,但是对于tomcat来说几乎没有BUG。
- tomcat可以配置NIO方式的socket通信,在性能上高于阻塞式的,每个请求不需要单独创建一个线程处理,并发能力比前者要高。但是没有阻塞式的成熟。
- 并发能力还与应用的逻辑密切相关,如果逻辑恒复杂需要大量计算,那并发能力势必会下降。
- 如果每个请求对数据库服务器请求较多,那对数据库性能要求也比较高。
- 系统环境不同、tomcat不同、JDK版本不同、以及修改参数设定不同,并发量也会有差异。