我正在尝试编写一个简单的程序来从std中获取行,解析它们,并将每条记录插入postgres数据库中。为了测试,我一直在针对只有cat my_file | java ...
以下是代码:
import scala.concurrent.ExecutionContext.Implicits.global
import scala.io.Source
import scala.util.Failure
import scala.util.Success
import slick.driver.PostgresDriver.api._
object LoadToDB extends App {
val db = Database.forConfig("dev-ingest")
for (line <- Source.fromInputStream(System.in).getLines()) {
val record = parse(line)
val insert = TableQuery[MyTable] += record
val fut = db.run(insert)
fut onComplete {
case Success(x) => {
System.out.println("Inserted one record: " + record)
}
case Failure(e) => {
e.printStackTrace()
}
}
}
}
理论上,文件中的行数,打印的“插入的一条记录”语句的数量以及数据库中的记录数都应该匹配。但是,它们都是不同的。文件中的行多于数据库中的记录,数据库中的记录多于打印的“已插入”语句。
我对scala / slick的异步执行模型有点新意,所以我怀疑我在那里做错了什么。也许当主线程结束时,所有剩余的线程都没有机会完成执行?有没有办法说“等待所有提交的任务完成”?我试过Await.result(db.shutdown(), Duration.Inf)
,但这似乎阻止了任务运行完成,只是立即杀死它。
答案 0 :(得分:3)
您的计划在期货结束前退出。你必须在某处阻止它们。