Я пытаюсь использовать простой код Scala в Play Framework 2.0, чтобы заполнить мою базу данных (существуют другие варианты, такие как импорт файла SQL непосредственно в базе данных, но это не главное):
def filldb = Action {
import play.api.db.DB
import anorm._
var result: Boolean = false
val tuples: List[(Long, String)] = DB
.withConnection("playground") { implicit c =>
for (i <- 1 until 1000000) {
SQL("""
INSERT INTO article (
id,
title
) VALUES (
""" + i + """,
'Article no """ + i + """');"""
).executeUpdate()
if (i % 1000 == 0) println("i:" + i)
}
val sqlQuery = SQL("select id, title from article order by id;")
sqlQuery().map(row =>
row[Long]("id") -> row[String]("title")).toList
}
Ok("done")
}
В течение некоторого времени это работает хорошо (итерации по 200 КБ), замедляется, постепенно расходует память (до 1,8 ГБ) и, наконец, падает из-за нехватки памяти.
Может кто-нибудь объяснить мне, что вызывает такое поведение?Понятно, что его можно закодировать по-разному, но суть в том, чтобы понять, что не так, чтобы ошибка не возникала в другом контексте ...
Чтобы завершить, вот подробности:
Пробовал это как weel, но безуспешно:
def filldb = Action {
import play.api.db.DB
import anorm._
var result: Boolean = false
val connection = DB.getConnection("playground")
for (i <- 1 until 1000000) {
SQL("""
INSERT INTO article (
id,
title
) VALUES (
""" + i + """,
'Article no """ + i + """');"""
).executeUpdate()(connection)
if (i % 1000 == 0) println("i:" + i)
}
val tuples: List[(Long, String)] = {
val sqlQuery = SQL("select id, title from article order by id;")
sqlQuery()(connection).map(row =>
row[Long]("id") -> row[String]("title")).toList
}
connection.close()
Ok("done")
}
Не лучше: застрял на 283k итераций ...