光滑的配置文件如何针对光滑的数据库工作
How does slick profile work with respect to slick DB
我无法理解如何使用 slick 配置文件。
我的问题:
我正在尝试通过 Alpakka JDBC 插件将 Slick 与 Akka-stream 一起使用。网上给出的例子如下:
#Load using SlickSession.forConfig("slick-h2")
slick-h2 {
profile = "slick.jdbc.H2Profile$"
db {
connectionPool = disabled
dataSourceClass = "slick.jdbc.DriverDataSource"
properties = {
driver = "org.h2.Driver"
url = "jdbc:h2:/tmp/alpakka-slick-h2-test"
}
}
}
import scala.concurrent.Future
import akka.Done
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl._
import akka.stream.alpakka.slick.scaladsl._
import slick.jdbc.GetResult
object SlickSourceWithPlainSQLQueryExample extends App {
implicit val system = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val ec = system.dispatcher
implicit val session = SlickSession.forConfig("slick-h2")
// The example domain
case class User(id: Int, name: String)
// We need this to automatically transform result rows
// into instances of the User class.
// Please import slick.jdbc.GetResult
// See also: "http://slick.lightbend.com/doc/3.2.1/sql.html#result-sets"
implicit val getUserResult = GetResult(r => User(r.nextInt, r.nextString))
// This import enables the use of the Slick sql"...",
// sqlu"...", and sqlt"..." String interpolators.
// See also: "http://slick.lightbend.com/doc/3.2.1/sql.html#string-interpolation"
import session.profile.api._
// Stream the results of a query
val done: Future[Done] =
Slick
.source(sql"SELECT ID, NAME FROM ALPAKKA_SLICK_SCALADSL_TEST_USERS".as[User])
.log("user")
.runWith(Sink.ignore)
done.onComplete {
case _ =>
session.close()
system.terminate()
}
}
问题是它适用于
implicit val session = SlickSession.forConfig("slick-h2")
我尝试使用 slick session 如下:
object Main extends App {
implicit val system = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val ec = system.dispatcher
implicit val session = SlickSession.forConfig("pp")
}
我的 pp 配置是这样的:
pp = {
url = "jdbc:oracle:thin:@52.4.90.244:1521:pp"
driver = oracle.jdbc.OracleDriver
keepAliveConnection = true
connectionPool = disabled
user = "xxxxx"
password = "xxxxx"
}
此代码在运行时中断。
Exception in thread "main" slick.SlickException: Configured profile oracle.jdbc.OracleDriver does not conform to requested profile slick.jdbc.JdbcProfile
at slick.basic.DatabaseConfig$.forConfig(DatabaseConfig.scala:99)
at akka.stream.alpakka.slick.javadsl.SlickSession$.forConfig(package.scala:47)
at akka.stream.alpakka.slick.javadsl.SlickSession$.forConfig(package.scala:44)
但是在另一个代码中,我不使用 Akka-Stream,因此不使用 slickSession
object Main extends App {
val db = Database.forConfig("pp")
.....}
代码完美运行。
我得出结论,这与 Database.forconfig("pp") 和 SlickSession.forConfig("slick-h2") 需要 2 个不同的东西。
Slick 网站上有关于配置文件的解释,但不是很容易理解并且提供的指导很少。它没有列出可用的配置文件及其语法。
因此我的问题是,两者之间有什么区别 forConfig。
配置文件如何工作,在哪里需要它们。为什么数据库的两个配置文件的处理方式不一样。
最后,最重要的是,oracle 的配置文件是什么。在 slick 3.2.3 中,Slick 现在是免费的。我找不到它的配置文件,如 profile = "slick.jdbc.H2Profile$"
有人可以帮助阐明配置文件的区别、预期的内容、配置文件的作用以及 Oracle 的配置文件是什么吗?
Slick 文档中的 upgrade guide 解释了驱动程序和配置文件之间的区别:
Slick’s driver
concept has been renamed to profile
to end the confusion over Slick drivers vs JDBC drivers....
至于Alpakka的SlickSession
不接受你的配置的原因,看看source code:
object SlickSession {
private final class SlickSessionImpl(val slick: DatabaseConfig[JdbcProfile]) extends SlickSession {
val db: JdbcBackend#Database = slick.db
val profile: JdbcProfile = slick.profile // <-- expects a profile
}
...
}
SlickSession
专门在配置中查找配置文件,这就是定义驱动程序不起作用的原因。
要为 Oracle 定义配置文件,请使用 OracleProfile
。
作为@Jeffrey Chung 回答的后续。这是解决方案。
implicit val session = SlickSession.forConfig("pp")
import session.profile.api._
配置文件应该是这样的:
pp {
profile = "slick.jdbc.OracleProfile$"
db {
url = "..."
driver = oracle.jdbc.OracleDriver
keepAliveConnection = true
connectionPool = disabled
user = "...."
password = "...."
}
}
我无法理解如何使用 slick 配置文件。
我的问题:
我正在尝试通过 Alpakka JDBC 插件将 Slick 与 Akka-stream 一起使用。网上给出的例子如下:
#Load using SlickSession.forConfig("slick-h2")
slick-h2 {
profile = "slick.jdbc.H2Profile$"
db {
connectionPool = disabled
dataSourceClass = "slick.jdbc.DriverDataSource"
properties = {
driver = "org.h2.Driver"
url = "jdbc:h2:/tmp/alpakka-slick-h2-test"
}
}
}
import scala.concurrent.Future
import akka.Done
import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl._
import akka.stream.alpakka.slick.scaladsl._
import slick.jdbc.GetResult
object SlickSourceWithPlainSQLQueryExample extends App {
implicit val system = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val ec = system.dispatcher
implicit val session = SlickSession.forConfig("slick-h2")
// The example domain
case class User(id: Int, name: String)
// We need this to automatically transform result rows
// into instances of the User class.
// Please import slick.jdbc.GetResult
// See also: "http://slick.lightbend.com/doc/3.2.1/sql.html#result-sets"
implicit val getUserResult = GetResult(r => User(r.nextInt, r.nextString))
// This import enables the use of the Slick sql"...",
// sqlu"...", and sqlt"..." String interpolators.
// See also: "http://slick.lightbend.com/doc/3.2.1/sql.html#string-interpolation"
import session.profile.api._
// Stream the results of a query
val done: Future[Done] =
Slick
.source(sql"SELECT ID, NAME FROM ALPAKKA_SLICK_SCALADSL_TEST_USERS".as[User])
.log("user")
.runWith(Sink.ignore)
done.onComplete {
case _ =>
session.close()
system.terminate()
}
}
问题是它适用于
implicit val session = SlickSession.forConfig("slick-h2")
我尝试使用 slick session 如下:
object Main extends App {
implicit val system = ActorSystem()
implicit val mat = ActorMaterializer()
implicit val ec = system.dispatcher
implicit val session = SlickSession.forConfig("pp")
}
我的 pp 配置是这样的:
pp = {
url = "jdbc:oracle:thin:@52.4.90.244:1521:pp"
driver = oracle.jdbc.OracleDriver
keepAliveConnection = true
connectionPool = disabled
user = "xxxxx"
password = "xxxxx"
}
此代码在运行时中断。
Exception in thread "main" slick.SlickException: Configured profile oracle.jdbc.OracleDriver does not conform to requested profile slick.jdbc.JdbcProfile
at slick.basic.DatabaseConfig$.forConfig(DatabaseConfig.scala:99)
at akka.stream.alpakka.slick.javadsl.SlickSession$.forConfig(package.scala:47)
at akka.stream.alpakka.slick.javadsl.SlickSession$.forConfig(package.scala:44)
但是在另一个代码中,我不使用 Akka-Stream,因此不使用 slickSession
object Main extends App { val db = Database.forConfig("pp") .....}
代码完美运行。
我得出结论,这与 Database.forconfig("pp") 和 SlickSession.forConfig("slick-h2") 需要 2 个不同的东西。
Slick 网站上有关于配置文件的解释,但不是很容易理解并且提供的指导很少。它没有列出可用的配置文件及其语法。
因此我的问题是,两者之间有什么区别 forConfig。 配置文件如何工作,在哪里需要它们。为什么数据库的两个配置文件的处理方式不一样。
最后,最重要的是,oracle 的配置文件是什么。在 slick 3.2.3 中,Slick 现在是免费的。我找不到它的配置文件,如 profile = "slick.jdbc.H2Profile$"
有人可以帮助阐明配置文件的区别、预期的内容、配置文件的作用以及 Oracle 的配置文件是什么吗?
Slick 文档中的 upgrade guide 解释了驱动程序和配置文件之间的区别:
Slick’s
driver
concept has been renamed toprofile
to end the confusion over Slick drivers vs JDBC drivers....
至于Alpakka的SlickSession
不接受你的配置的原因,看看source code:
object SlickSession {
private final class SlickSessionImpl(val slick: DatabaseConfig[JdbcProfile]) extends SlickSession {
val db: JdbcBackend#Database = slick.db
val profile: JdbcProfile = slick.profile // <-- expects a profile
}
...
}
SlickSession
专门在配置中查找配置文件,这就是定义驱动程序不起作用的原因。
要为 Oracle 定义配置文件,请使用 OracleProfile
。
作为@Jeffrey Chung 回答的后续。这是解决方案。
implicit val session = SlickSession.forConfig("pp") import session.profile.api._
配置文件应该是这样的:
pp { profile = "slick.jdbc.OracleProfile$" db { url = "..." driver = oracle.jdbc.OracleDriver keepAliveConnection = true connectionPool = disabled user = "...." password = "...." } }