【问题标题】:How does slick profile work with respect to slick DB光滑的配置文件如何相对于光滑的 DB 工作
【发布时间】:2019-01-30 05:55:39
【问题描述】:

我无法理解如何使用 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()
  }
}

问题在于它适用于

隐式验证会话 = 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") 需要两个不同的东西有关。

在 Slick 网站上有关于配置文件的解释,但不是很容易理解并且提供的指导很少。它没有列出可用的配置文件及其语法。

因此我的问题是,这两个 forConfig 有什么区别。 配置文件如何工作,它们在哪里需要。为什么数据库的两个配置文件处理方式不同。

最后,最重要的是,oracle 的配置文件是什么。在 slick 3.2.3 中,Slick 现在是免费的。我在 profile = "slick.jdbc.H2Profile$"

中找不到它的配置文件

有人可以帮助澄清配置文件的区别、预期的内容、配置文件的作用以及 Oracle 的配置文件是什么?

【问题讨论】:

    标签: scala slick akka-stream alpakka


    【解决方案1】:

    Slick 文档中的 upgrade guide 解释了驱动程序和配置文件之间的区别:

    Slick 的 driver 概念已重命名为 profile,以结束对 Slick 驱动程序与 JDBC 驱动程序的混淆......

    至于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

    【讨论】:

    • 老实说,这方面的文档不是很好。我昨天按照您在此处推荐的一些步骤进行了挖掘,并弄清楚了如何使其工作。但是这个 conf 的东西是非常复杂的,因为它并不简单。我的意思是必须研究代码才能理解它。文档使用 DB,例如使用 DB 或 Profile,尽管它是一种旧方法。我花了一些时间来弄清楚我需要做什么。它有效,但我什至不能 100% 确定我在做正确的事情
    【解决方案2】:

    作为@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            = "...."
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多