2015-03-25 60 views
2

我是一個Slick初學者,只是試驗Slick 3.0 RC1。在我的第一個項目中,我想將文本文件中的數據導入到各種表格中。由於數據在一個事務中的文件中,因此整個導入應該按順序發生。如何使用DBIO.sequence和避免StackOverflowError

我試着創建一個迭代器的動作,並將它們包裝在一個DBO.sequence中。

問題是,當行數很大時,導入將失敗並帶有StackOverflowError。很明顯,我誤解了如何使用Slick來做我想做的事情。如何將大量數據鏈接到一個事務中有更好的方法嗎?

這裏是我的代碼的簡化版本,我不是從文件中讀取數據,而是從Range中「導入」數字。甚至是桌子XS,甚至是桌子YS。

val db = Database.forConfig("h2mem1") 

try { 

    class Xs(tag: Tag) extends Table[(Long, String)](tag, "XS") { 
    def id = column[Long]("ID", O.PrimaryKey) 
    def name = column[String]("NAME") 
    override def * : ProvenShape[(Long, String)] = (id, name) 
    } 

    class Ys(tag: Tag) extends Table[(Long, String)](tag, "YS") { 
    def id = column[Long]("ID", O.PrimaryKey) 
    def name = column[String]("NAME") 
    override def * : ProvenShape[(Long, String)] = (id, name) 
    } 

    val xs = TableQuery[Xs] 
    val ys = TableQuery[Ys] 


    val setupAction = DBIO.seq((xs.schema ++ ys.schema).create) 

    val importAction = DBIO.sequence((1L to 100000L).iterator.map { x => 
    if (x % 2 == 0) { 
     xs +=(x, x.toString) 
    } else { 
     ys +=(x, x.toString) 
    } 
    }) 

    val f = db.run((setupAction andThen importAction)) 

    Await.result(f, Duration.Inf) 

} finally { 
    db.close 
} 

回答

0

該問題是由RC1版本的Slick中不是非常高效的實現引起的。實施已得到改進,如在線程here中看到的那樣。

在Slick 3 RC 3中,問題解決了:)