这些问题类似于:
我必须索引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 = MEMORY
和synchronous = off
会提高插入速度。如何用光滑设置这些?我使用c3p0作为连接池,并将PRAGMA journal_mode = MEMORY
添加到preferredTestQuery
。我不相信这是设置这些选项的正确方法。
感谢您的帮助!
答案 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
重新使用相同的连接。