Java HikariPool-1-使用线程时连接不可用
嗨,伙计们,当我迭代列表并存储在 数据库使用线程,插入1000后出现错误 记录 错误:Java HikariPool-1-使用线程时连接不可用,java,multithreading,spring-boot,Java,Multithreading,Spring Boot,嗨,伙计们,当我迭代列表并存储在 数据库使用线程,插入1000后出现错误 记录 错误: "Thread-2614" org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is
"Thread-2614" org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction;
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30080ms.
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
我的代码
while (rowIt.hasNext()) {
try {
Thread t1 = new Thread() {
public void run() {
DimCompany comp = new DimCompany();
Row row = rowIt.next();
Cell c = row.getCell(cmpName);
if (c != null && c.getCellType() != c.CELL_TYPE_BLANK) {
if (cmpName != null && row.getCell(cmpName) != null) {
comp.setCompanyName(row.getCell(cmpName).toString());
comp.setSourecLevel1("MCA");
}
if (cmpUId != null && row.getCell(cmpUId) != null) {
comp.setCompanyUniqueId(row.getCell(cmpUId).toString());
}
if (compType != null && row.getCell(compType) != null) {
comp.setCompType(row.getCell(compType).toString());
}
if (foundedDate != null && row.getCell(foundedDate) != null) {
comp.setFoundedDate(row.getCell(foundedDate).toString());
}
//save record
int i = parseDataDao.saveCompany(comp);
}
}
};
t1.start();
} catch (Exception e) {
System.out.println(e);
}
}
创建无界线程是代码中的主要问题 默认情况下,Hikari的池大小为10个连接。您可以使用以下方法增加它:
hikariDataSource.setMaximumPoolSize(...);
您正在创建一千多个线程并同时运行它们。它们的数量远远超过hikari池大小(无论您设置了什么,或者上面的默认值)。所以您的查询在队列中等待以获取连接,最终超时
您应该使用线程池。快速执行此操作的最简单方法是使用:
CompletableFuture.supplyAsync(() -> {/* contents of your run method here */});
这将使用ForkJoin公共池。您可以使用的进行微调。使用一个包含10个线程的线程池并向其提交任务,如下所示
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.submit(task1);
这将确保您的任务异步运行,并且不会出现连接不足的情况我认为这不是线程问题,而是连接池配置问题。您是否可以共享正在使用的Hikari池配置。我认为在连接空闲期间会发生超时。实际上,我的应用程序中没有配置Hikari池,我们可以在哪个文件中配置Hikar池?我正在使用Spring Boot Frameworkapplication.properties或applicaton.yaml文件,但如果我添加t1.sleep(20);然后它可以正常工作,但我需要一些不同的解决方案检查您的数据库属性抱歉,但它在我的代码中不起作用,您能否建议我另一个解决方案在while循环之外创建Executor服务,并执行此executorService.submit(t1);代替t1.start(),但如果我添加t1.sleep(20);那么它可以正常工作,但是我想要一些不同的解决方案,对不起,但是它在我的代码中不起作用,你能给我推荐另一个吗solution@AMARMAGAR你说不工作是什么意思?你也会犯同样的错误吗?如果是,您是否可以编辑您的问题以在底部添加新代码?