在aop后记录用户日志时出现许多用户同时访问的高并发线程堵塞情况,这时候就不能及时记录日志了,怎么样解决日志记录时的并发问题呢?

怎么样解决日志记录时的并发问题呢?

解决1,通过自己创建线程的方式将插入日志的方法存在线程的run方法中

答案:不可取,因为创建线程本身就会造成内存资源消耗,内存过大会造成oom错误,每创建一个线程操作系统会为其分配1m左右的内存,创建多个线程则消耗更大。

最佳办法:
将插入操作放入线程池中
在基于注解方式的配置中,借助@EnableAsync 注解进行异步启动声明,Spring
一、Boot 版的项目中,将@EnableAsync 注解应用到启动类上,代码示例如下:

 @EnableAsync //spring 容器启动时会创建线程池
 @SpringBootApplication
 public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

二、 Spring 中@Async 注解应用
在需要异步执行的业务方法上,使用@Async 方法进行异步声明。

@Async
@Override
public void saveObject(SysLog entity) {
 System.out.println("SysLogServiceImpl.save:"+
Thread.currentThread().getName());
 sysLogDao.insertObject(entity);
 //try{Thread.sleep(5000);}catch(Exception e) {}}

三、当我们需要自己对 spring 框架提供的线程池进行一些简易配置,可以参考如下代码:

spring:
 task:
 execution:
 pool:
 queue-capacity: 128
 core-size: 5
 max-size: 128
 keep-alive: 60000
 thread-name-prefix: db-service-task

总结:加了@async注解的方法,springboot底层会将其作为一个切入点,底层通过通知的方式在线程池取出一个线程执行这个切入点方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值