scala - Oracle Slick 驱动程序支持流吗?

标签 scala akka slick akka-stream slick-3.0

我在 Scala 2.11.8 上使用 Slick 3.1.0。这是使用灵活的扩展来查询 Oracle 数据库。

我写了下面的代码

type MyTup = (String, String, String)
implicit val actorSystem = ActorSystem()
implicit val materializer = ActorMaterializer()
val db = Database.forConfig("oracle")
val query = sql"""select col1, col2, col3 from FOO.BAR""".as[MyTup]
val source = Source.fromPublisher[MyTup](db.stream(query))
val sink = Sink.foreach[MyTup](row => println(row))
val flow = source to sink
flow.run()
readLine()
db.close()

当我运行这段代码时,这段代码运行了很长一段时间而不打印任何东西......这似乎意味着它试图在打印之前读取整个结果(因此它不是流式传输)。

我已经在MySQL上完成了流式传输,并且我知道它需要特殊配置才能启用流式传输

https://github.com/slick/slick/issues/1218

oracle是否也需要一些像MySql这样的特殊配置?

我的build.sbt

libraryDependencies ++= Seq(
   "com.typesafe.slick" % "slick-extensions_2.11" % "3.1.0",
   "com.typesafe.slick" % "slick_2.11" % "3.1.0",
   "com.typesafe.slick" % "slick-codegen_2.11" % "3.1.0",
   "oracle" % "ojdbc7_2.11" % "7.0.0",
   "com.typesafe.slick" % "slick-hikaricp_2.11" % "3.1.0",
   "com.typesafe.akka" % "akka-stream_2.11" % "2.5.4"
)

最佳答案

好的。我找到了答案。是的,Oracle 驱动程序确实支持流式传输,并且不需要像 mysql 那样的任何额外配置。

这是我的 application.conf

oracle {
  driver = "slick.jdbc.OracleProfile$"
  dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
  properties {
    driver = "oracle.jdbc.OracleDriver"
    url = "jdbc:oracle:thin:user/password@//server:1521/serviceName"
  }
  numThreads = 10
  connectionTimeout = 10000
}

我的build.sbt

"com.typesafe.slick" %% "slick" % "3.2.1",
"com.typesafe.slick" %% "slick-hikaricp" % "3.2.1",
"oracle" % "ojdbc7_2.11" % "7.0.0",
"com.typesafe.akka" %% "akka-stream" % "2.5.4"

请注意,我没有使用光滑的扩展,因为它们已经过时了。新的 Oracle 驱动程序 (OracleProfile) 包含在 slick 核心版本本身中。

这里唯一的技巧是条目 "oracle"% "ojdbc7_2.11"% "7.0.0" 是假的。因为我下载了jar并在本地sbt中像这样发布了它。 (oracle不提供oracle驱动程序作为sbt/maven依赖)

现在这是我的代码,它可以完美地传输数据:)

implicit val actorSystem = ActorSystem()
implicit val actorMaterializer = ActorMaterializer()
val db = Database.forConfig("oracle")
val query = sql"select member_id from foo".as[Long]
val publisher = db.stream(query)
val source = Source.fromPublisher[Long](publisher)
val sink = Sink.foreach[Long](x => println(x))
val graph = RunnableGraph.fromGraph(GraphDSL.create(sink){implicit builder => s =>
  import GraphDSL.Implicits._
  source ~> s.in
  ClosedShape
})
val future = graph.run()
Await.result(future, Duration.Inf)
db.close()

关于scala - Oracle Slick 驱动程序支持流吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186035/

相关文章:

scala - 为什么 sbt 不在这里获取作用域值?

eclipse - 在 Eclipse 中,我可以为我的项目选择 Scala 版本吗?

scala - 将 ActorRef 传递给其他 Actor 是好是坏?

scala - Akka Actor 、 future 和闭包

java - 是否可以从 ActorSelection 中检索多个 actorRef?

scala - 光滑的连接池?

光头选项什么也不做

scala - Scala集合中缺少par方法

scala - 单元格宽度 Jupyter 笔记本 - Apache Toree - Scala

postgresql - 由于含糊不清的隐式,无法将 MappedProjection 转换为 ProvenShape