6
,同时通过在光滑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 [email protected] rejected from [email protected][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
}
我仍然有太多客户错误...
“*遗憾,太多的客户已经*”表示你打开很多很多连接,但你永远不会关闭它们。 –
你可以发表你是如何调用insertBatch和一点点更舒服的代码吗?如@a_horse_with_no_name所示,错误意味着您打开了一个太多的连接。 – Biswanath
li.map {trip => val data = for { tripData < - TripDataRepository.insertQuery(trip.tripData)//(TripDataRepository.query返回TripDataRepository.query.map(obj => obj)+ = trip.tripData) subTripData < - SubTripDataRepository.insertBatchQuery(getUpdatedSubTripDataList(trip.subTripData,tripData.id)) }产率((tripData,subTripData)) VAL解析度= db.run(data.transactionally) – Archana