最近遇到个问题,因为业务需求将表中的五个字段改成了CLOB,结果出现了sql异常,修改方式就是将这五个字段单独拿出来查询,结果导致了查询慢的问题,由于sql年代久远,涉及十几张表的关联,加减乘除,group by等等,实在不想大改。
后端:Java,JDK8
前端:Nexacro
因为数据量特别大,甲方不同意分页查询,只能尝试使用多线程来解决,虽通过文心一言 来查询合适的代码来实现。结合阿里巴巴代码规约,最终确认使用如下代码:
public static ThreadPoolExecutor creatThread(String name, int size) {
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(name).build();
return new ThreadPoolExecutor(size,//corePoolSize:线程池核心池的大小。
size,//maximumPoolSize: 线程池的最大线程数。
0L,//keepAliveTime: 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间(空闲线程存活时间)。
TimeUnit.MICROSECONDS,//unit: keepAliveTime 的时间单位。
new LinkedBlockingQueue<>(1024),//workQueue: 存放提交但未执行任务的队列。
threadFactory,//threadFactory: 创建线程的工厂类。
new ThreadPoolExecutor.AbortPolicy()//handler:等待队列满后的拒绝策略。
);
}
ThreadFactoryBuilder使用的是谷歌guava。
POM为
com.google.guava
guava
32.1.3-jre
在Idea中运行正常,测试了几十遍,没有任何问题,但是由于提交代码要使用基于Eclipse的工具,在打开Eclipse时,就发现出现了编译错误。
从源代码分析,使用的构造器如下:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
但是Eclipse一直提示没有找到构造器,查看源代码没有发现问题:
public class LinkedBlockingQueue extends AbstractQueue
implements BlockingQueue, java.io.Serializable{
}
public static class AbortPolicy implements RejectedExecutionHandler {
}
但还是尝试修改了代码,以避免提交代码后出现编译问题,修改后的代码编译正常,代码如下:
public static ThreadPoolExecutor creatThread(String name, int size) {
ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(name).build();
BlockingQueue linkedBlockingQueue = new LinkedBlockingQueue<>(1024);
RejectedExecutionHandler abortPolicy = new ThreadPoolExecutor.AbortPolicy();
return new ThreadPoolExecutor(size,//corePoolSize:线程池核心池的大小。
size,//maximumPoolSize: 线程池的最大线程数。
0L,//keepAliveTime: 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间(空闲线程存活时间)。
TimeUnit.MICROSECONDS,//unit: keepAliveTime 的时间单位。
linkedBlockingQueue,//workQueue: 存放提交但未执行任务的队列。
threadFactory,//threadFactory: 创建线程的工厂类。
abortPolicy//handler:等待队列满后的拒绝策略。
);
}
不知道为何,在公司内网环境中无法编译通过,在我的PC上新装的Eclipse中可以编译通过。
新安装的Eclipse版本为:2023-12 (4.30.0);
公司内网Eclipse版本为:2017-06(好像是这个);
再有一个不同就是内网是jar包,我本地PC是maven+boot。
为什么编译不过,没有探究出来,希望有大神可以指点一二。