Postgre SQL   发布时间:2022-05-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了postgresql – 批处理插入时Slick 3.0中的数据库异常大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_607_1@
通过在光滑3中批量插入每5秒插入数千条记录,我得到了

org.POSTGResql.util.PsqlException: FATAL: sorry,too many clIEnts already

我的数据访问层看起来像:

val db: CustomPOSTGResDriver.BACkend.DatabaseDef = Database.forURL(url,user=user,password=password,driver= jdbcDriver)



 overrIDe def insertBatch(rowList: List[T#tableElementType]): Future[Long] = {
    val res = db.run(insertBatchquery(rowList)).map(_.head.tolong).recover{ case ex:Throwable=> RelationalRepositoryUtility.handleBatchOperationErrors(eX)}
//db.close()
        res
      }

  overrIDe def insertBatchquery(rowList: List[T#tableElementType]): FixedsqlAction[Option[Int],NoStream,Write] = {
    query ++= (rowList)
  }

在插入批处理中关闭连接没有任何影响…它仍然给出相同的错误.

我从我的代码中调用插入批处理,如下所示:

val temp1 = List1.flatMap { li =>
        Future.sequence(li.map { trip =>
            val data = for {
              triPDAta <- TriPDAtaRepository.insertquery( trip.triPDAta)
              subTriPDAta <- SubTriPDAtaRepository.insertBatchquery(getupdatedSubTriPDAtaList(trip.subTriPDAta,triPDAta.ID))
            } yIEld ((triPDAta,subTriPDAta))
            val res=db.run(data.transactionally)
          res
//db.close()
        })
      }

如果我在我的工作后关闭连接,你可以在评论代码中看到我得到错误:

java.util.concurrent.RejectedExecutionException: Task slick.BACkend.DatabaseComponent$DatabaseDef$$anon$2@6c3ae2b6 rejected from java.util.concurrent.ThreadPoolExecutor@79d2d4eb[Terminated,pool size = 0,active threads = 0,queued tasks = 0,completed tasks = 1]

在调用没有Future.sequence的方法后,像这样:

val temp1 =List.map { trip =>
          val data = for {
            triPDAta <- TriPDAtaRepository.insertquery( trip.triPDAta)
            subTriPDAta <- SubTriPDAtaRepository.insertBatchquery(getupdatedSubTriPDAtaList(trip.subTriPDAta,triPDAta.ID))
          } yIEld ((triPDAta,subTriPDAta))
          val res=db.run(data.transactionally)
          res
      }

我仍然有太多的客户错误…

解决方法

这个问题的根源在于,您正在同时启动一个无限的Future列表,每个列表都连接到数据库 – 列表中每个条目一个.

这可以通过串行运行插入来解决,强制每个插入批处理依赖于前一个:

// Empty Future for the results. replace Unit with the correct type - whatever
// "res" is below.
val emptyFuture = Future.successful(Seq.emptY[Unit])
// This will only insert one at a time. You Could use List.slIDing to batch the
// inserts if that was important.
val temp1 = List.foldleft(emptyFuturE) { (prevIoUsFuture,trip) =>
  prevIoUsFuture flatMap { prevIoUs =>
    // Inner code copIEd from your example.
    val data = for {
      triPDAta <- TriPDAtaRepository.insertquery(trip.triPDAta)
      subTriPDAta <- SubTriPDAtaRepository.insertBatchquery(getupdatedSubTriPDAtaList(trip.subTriPDAta,triPDAta.ID))
    } yIEld ((triPDAta,subTriPDAta))
    val res = db.run(data.transactionally)
    prevIoUs :+ res
  }
}

大佬总结

以上是大佬教程为你收集整理的postgresql – 批处理插入时Slick 3.0中的数据库异常全部内容,希望文章能够帮你解决postgresql – 批处理插入时Slick 3.0中的数据库异常所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: