怎么样解决日志记录时的并发问题呢?
解决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底层会将其作为一个切入点,底层通过通知的方式在线程池取出一个线程执行这个切入点方法