Oracle Slick Driver 是否支持流式处理?
Does the Oracle Slick Driver support Streaming?
我在 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()
当我 运行 这段代码时,这段代码 运行s 很长一段时间没有打印任何东西....这似乎暗示它在打印之前试图读取整个结果(所以它不是流媒体)。
我在 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"
请注意,我没有使用 slick 扩展,因为它们已经过时了。新的 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 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()
当我 运行 这段代码时,这段代码 运行s 很长一段时间没有打印任何东西....这似乎暗示它在打印之前试图读取整个结果(所以它不是流媒体)。
我在 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"
请注意,我没有使用 slick 扩展,因为它们已经过时了。新的 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()