У меня есть скрипт, который я хочу запустить, чтобы просмотреть таблицу mysql, содержащую около 4M записей, и для каждой из них я выполняю другой вызов другой таблицы mysql, чтобы получить больше данных, из этих данных я создаю новый объект и вставляю егона mongodb.
, поэтому в основном я хочу выполнить миграцию с mysql на mongodb
im, используя quill, которая является библиотекой для работы с sql в вашем проекте scala (QDSL).
my script class is very short and looks like:
class MigrateScript @Inject()(dao: PeopleDao) {
lazy val ctx = new MysqlAsyncContext(SnakeCase, "mysql")
import ctx._
def getNextPerson(idx: Int): Future[Person] = {
val q = quote {
query[Person].drop(lift(idx)).take(1)
}
ctx.run(q.take(1)).map(_.head) recover {
case t: NoSuchElementException =>
println(s"problem with index: $idx")
throw new RuntimeException
}
}
def getPersonKids(personId: Int): Future[List[Kid]] = {
val q = quote {
query[Kid].filter(kid => kid.parent_id == lift(personId))
}
ctx.run(q)
}
def runScript(numberOfRecords: Int): Unit = {
for (a <- 0 to numberOfRecords) {
getNextPerson(a).map(person => {
getPersonKids(person.id).map(kids => {
// create obj and insert to mongo
val parentWithKidsObjectToInsert = // creating new object using person & kids
dao.insert(parentWithKidsObjectToInsert) // this returns Future[String]
})
})
}
}
}
чтобы запустить его, я делаю это из моего контроллера следующим образом:
def insertMySqlRecordsToMongo(numberOfRecords: Int) = Action { request =>
mScript.runScript(numberOfRecords)
Ok
}
выдает:
когда я запускаю его таким образом, скрипт застреваетпосле 100 + - записей и я получаю ошибки в моем журнале:
java.util.concurrent.TimeoutException: фьючерсы истекли через [5 секунд]
и
WARN [ousekeeper] - c.z.h.p.HikariPool(755) - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=1m51s17ms).
чувствуется, что приложение работает быстрее, чем может обработать пул соединений mysql ...
поэтому я попытался добавить Await.result выше getNextPerson, и он работает хорошо, но очень медленно.Это только вставка 300 записей в минуту, что может занять несколько дней, чтобы просмотреть записи 4M ...
Какие-либо решения, пожалуйста?спасибо, кто нашел время, чтобы понять это: