我正在 play framework 2.0 中尝试一个简单的 scala 代码来填充我的数据库(存在其他选项,例如直接在数据库中导入 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")
}
这运行了一段时间(200K 迭代),速度变慢,逐渐消耗内存(高达 1.8GB),最后因内存不足而崩溃。
有人可以解释一下导致这种行为的原因吗?很明显,可以用不同的方式对其进行编码,但关键是要了解什么是错误的,这样错误就不会在另一个上下文中发生......
为了完整起见,以下是详细信息:
- 操作系统:mac 10.6.8
- 播放:2.0
- 数据库:mysql 5.5.12
桌子 :
CREATE TABLE article ( id bigint(20) NOT NULL UNIQUE, title varchar(255) NOT NULL, PRIMARY KEY (id) );
也试过这个,没有更多的成功:
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 次迭代...