批量插入时Slick 3.0中的数据库异常

阿卡那

通过在slick 3中批量插入每五秒钟插入数千条记录时,我得到

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,每个列表都连接到数据库-中的每个条目一个list

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

// 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
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android Sqlite 数据库在执行批量插入时被锁定

优化数据库操作 Slick 3

在oracle中批量插入时,表名称无效

将API中的数据插入Symphony3中的数据库中

SQLite3在数据库中插入数据在C中不起作用

在Slick 3中的事务中执行非数据库操作

jsp在数据库中插入时间

如何使脚本在我的默认sqlite3数据库django中插入数据

如何将列表中的数据插入SQLite3数据库

Swift 3脚本无法运行PHP脚本在MySQL数据库中插入数据

数据未使用 php 插入到 sqlite3 数据库中

使用Slick 3和Play检查数据库中是否存在元素

从数据库中获取价值并将其插入到下拉列表中Symfony 3

C#批量插入数据库

使用CSV文件中的批量插入时修改和检查数据-SQL

将数据插入数据库 CodeIgniter 3.x

无法插入cocos2dx中的sqlite3数据库

如何在3个不同的数据库中插入和更新?

无法创建数据库表并在iOS sqlite3中插入

在 sqlite3 数据库中插入日期时间错误

如何使用 Python 将日期时间插入到 sqlite3 数据库中?

在Playframework(2.4-M3)和Slick(3.0.0-RC3)中异步等待数据库值

将PHP异常和错误记录到数据库表PHP Slim 3中

使用数组将数据一次插入3个表中到Postgresql数据库中

在Pymongo中执行批量插入时如何忽略错误。我在pymongo中使用有序的批量写入操作

使用批量插入时,我在money栏中的值会更改

在sqlite3 C ++中批量插入的更好方法

无法插入Sqlite3数据库

使用SQLite3(Ruby)的数据库未插入