嗨,大家好,当我迭代列表并存储在 数据库使用线程,插入1,000后出现错误 记录
错误:
<nvd3 #lineChart [options]="options" [data]="data" *ngIf="isLoaderShow != true"></nvd3>
我的代码
"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
答案 0 :(得分:0)
创建无界线程是代码中的主要问题。
默认情况下,Hikari的池大小为10个连接。您可以使用以下方法增加它:
hikariDataSource.setMaximumPoolSize(...);
您正在创建一千多个线程并立即运行它们。这些数量比hikari池大小(无论您设置的是什么,还是上面的默认设置)大得多。因此,您的查询在队列中等待获取连接并最终超时。
您应该使用线程池。快速执行此操作的最简单方法是使用:
CompletableFuture.supplyAsync(() -> {/* contents of your run method here */});
这将使用ForkJoin公共池。您可以使用implementation中的ExecutorService
对其进行微调。
答案 1 :(得分:0)
使用10个线程的ThreadPool并向其提交任务,如下所示
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.submit(task1);
这将确保您的任务异步运行,并且不会发生连接耗尽