为什么这个简单的scala代码占用了这么多内存,最终崩溃了?(播放框架2.0)

为什么这个简单的scala代码占用了这么多内存,最终崩溃了?(播放框架2.0),scala,playframework-2.0,anorm,Scala,Playframework 2.0,Anorm,我正在PlayFramework2.0中尝试一个简单的scala代码来填充我的db(还有其他选项,例如直接在数据库中导入SQL文件,但这不是重点): 以weel身份尝试此操作,但没有成功: def filldb = Action { import play.api.db.DB import anorm._ var result: Boolean = false val connection = DB.getConnection("playground") for (i

我正在PlayFramework2.0中尝试一个简单的scala代码来填充我的db(还有其他选项,例如直接在数据库中导入SQL文件,但这不是重点):

以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")
}
def filldb=操作{
导入play.api.db.db
进口阿诺姆_
变量结果:布尔值=false
val connection=DB.getConnection(“游乐场”)
为了
行[Long](“id”)->行[String](“title”)。toList
}
连接。关闭()
好的(“完成”)
}

不是更好:停留在283k迭代…

我的第一个猜测是,您可能仍然在使用默认的内存中数据库。您能检查并确保您的conf/application.conf没有使用jdbc:h2:mem:play吗?如果是这样的话,你所有的条目都会填满你的记忆

此外,您所做的每一条语句都会打开一个语句对象,该对象直到withConnection块结束时才会关闭。因为你有一百万个记忆,这可以建立起来。看


您可以尝试在查询操作之外填充数据库。我将试验1000批1000个,看看这是否能确定您的问题。

我认为您的问题在于:

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
}
您正在用数据库中的所有行填充一个映射,因此您正在用1M行填充Scala/Java数据结构

你真的需要同时有一百万行吗?或者您是否需要以分页的方式使用它们(即前20页、后20页等)


这不是一个游戏问题,即使使用java和一个简单的jdbc测试,您也会遇到同样的问题。告诉我们元组的实际用法,我们可以提供一些建议

下面是配置:
db.playway.driver=com.mysql.jdbc.driver db.playway.url=“jdbc:mysql://localhost:3306/playground“db.playde.user=“root”db.playde.password=“XXXX”
这是什么
var result:Boolean=false
?不再使用的东西;-)删除。你能用一个while循环来代替理解吗?我试过了。相同的结果:283K迭代和错误:java.lang.OutOfMemoryError:java.util.Arrays.copyOf(Arrays.java:2734)~[na:1.6.029]位于java.util.ArrayList.ensureCapacity(ArrayList.java:167)。。。
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")
}
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
}