Java HikariPool-1-使用线程时连接不可用

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

嗨,伙计们,当我迭代列表并存储在 数据库使用线程,插入1000后出现错误 记录

错误:

 "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你说不工作是什么意思?你也会犯同样的错误吗?如果是,您是否可以编辑您的问题以在底部添加新代码?