Scala Slick 2.0和SQlite3插入速度和PRAGMA

时间:2013-12-17 10:49:54

标签: sqlite slick pragma

这些问题类似于:

我必须索引Wikipedia XML转储中的某些功能。解析很快。但是,插入很慢。

关闭索引会使速度加倍。

我这样批量插入:

    articles.grouped(5000)
           .foreach {
              batch: IterableView[(Article, List[Category], List[Link]), Iterable[_]] =>
                //Save each batch in one transaction
                database withTransaction {
                 implicit session =>
                   for(i <- batch) {
                     articles += i._1
                     categories ++= i._2
                     links ++= i._3
                   }

               }
            }

我读到journal_mode = MEMORYsynchronous = off会提高插入速度。如何用光滑设置这些?我使用c3p0作为连接池,并将PRAGMA journal_mode = MEMORY添加到preferredTestQuery。我不相信这是设置这些选项的正确方法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在Slick 3.2.0中,以下几行似乎有效:

import org.sqlite.SQLiteConfig
import slick.jdbc.JdbcBackend.Database
import slick.jdbc.SQLiteProfile.api._
...
val sqliConfig = new SQLiteConfig();
sqliConfig.setJournalMode(SQLiteConfig.JournalMode.MEMORY)
sqliConfig.setSynchronous(SQLiteConfig.SynchronousMode.OFF)
val emailsDB = Database.forURL(
  "jdbc:sqlite:/path/to/my/dbfile.sqlite",
  driver = "org.sqlite.JDBC",
  prop = sqliConfig.toProperties
)

其中org.sqlite来自:

libraryDependencies += "org.xerial" % "sqlite-jdbc" % "3.16.1"

答案 1 :(得分:1)

好像你在本地读一次数据。您根本不能使用交易,而是使用withSession。如果你仍然需要一个pragma,你可以通过纯SQL设置它。您可能希望在使用后重置pragma以避免副作用。

import scala.slick.jdbc.StaticQuery.interpolation

database withSession {
  implicit session =>
  sqlu"PRAGMA synchronous=OFF".execute
  articles.grouped(5000)
         .foreach {
            batch: IterableView[(Article, List[Category], List[Link]), Iterable[_]] =>
              //Save each batch in one transaction
               for(i <- batch) {
                 articles += i._1
                 categories ++= i._2
                 links ++= i._3
               }
           }
}

同样有趣的是,不仅数据库具有withTransaction方法,而且还有会话。因此,您可以在session.withTransaction块内withSession重新使用相同的连接。