2017-09-12 4 views
2

私はScala 2.11.8でSlick 3.1.0を使用しています。これは、滑らかな拡張機能を使用してOracleデータベースを照会しています。Oracle Streamsドライバはストリーミングをサポートしていますか?

私は、次のコード

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" 
) 

答えて

0

OK。私は答えを見つけた。はいOracleドライバはストリーミングをサポートしており、mysqlのような特別な設定は必要ありません。

は、ここに私のapplication.conf

oracle { 
    driver = "slick.jdbc.OracleProfile$" 
    dataSourceClass = "slick.jdbc.DatabaseUrlDataSource" 
    properties { 
    driver = "oracle.jdbc.OracleDriver" 
    url = "jdbc:oracle:thin:user/[email protected]//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)は、滑らかなコアリリース自体の中に入っています。

ここでのトリックは、"oracle" % "ojdbc7_2.11" % "7.0.0"というエントリが偽物であることです。私はjarファイルをダウンロードし、ローカルのsbtでこれを公開したからです。 (オラクルは、SBT/Mavenの依存関係としてOracleドライバを提供していません)

さて、これは私のコードであり、それは素晴らしく、データストリーム:)

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() 
関連する問題