如何在 Typesafe conf 上为 Slick 3.0.0 RC1 配置 HikariCP

How to configure HikariCP for Slick 3.0.0 RC1 on Typesafe conf

我有一个基于 play-scala Typesafe template (Play Scala Seed) 的 Play 应用程序,并尝试将 Slick 3.0.0 添加到项目并连接到 PostgreSQL 数据库。

首先我将依赖添加到build.sbt:

libraryDependencies ++= Seq(
    "com.typesafe.slick" %% "slick" % "3.0.0-RC1",
    "postgresql" % "postgresql" % "9.1-901.jdbc4"
)

然后在application.conf上添加数据库配置:

brDb = {
  dataSourceClass = org.postgresql.ds.PGSimpleDataSource
  url = "jdbc:postgresql://localhost:5432/test"
  user = "postgres"
  password = "postgres"
  numThreads = 10
}

请注意,我没有明确禁用池化,因此默认情况下它是启用的,并且会尝试使用 HikariCP,因为从 Slick 3.0.0 RC1 开始,HikariCP support exists and pooling using it is enabled by default

并且在我的 DAO 对象中,尝试像这样获取数据库连接:

Database.forConfig("brDb")

当我 运行 应用程序使用 activator run 时,出现此错误:

RuntimeException: java.lang.NoClassDefFoundError: com/zaxxer/hikari/HikariConfig

然后我尝试在 build.sbt 中添加 HikariCP 作为依赖:

libraryDependencies ++= Seq(
    // ...
    "com.zaxxer" % "HikariCP" % "2.3.3",
    // ...
)

使用 activator clean compile 清理并重新编译了应用程序,然后 运行 再次对其进行了编译,但出现了另一个错误:

RuntimeException: java.lang.UnsupportedClassVersionError: com/zaxxer/hikari/HikariConfig

我想我缺少一些配置,但我不确定也没有找到更多相关信息。我应该如何设置配置才能使连接池正常工作?

该错误意味着 HikariCP 包是为比您 运行 使用的 JRE 更新的 JRE 编译的。事实上,如果你 look at the homepage,你会看到你使用的版本是这样的:

Java 8 maven artifact:

<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>HikariCP</artifactId>
  <version>2.3.5</version>
  <scope>compile</scope>
</dependency>

我想你在 Java 上 运行 7. 为此,将以下内容添加到你的 build.sbt:

libraryDependencies ++= Seq(
  "com.zaxxer" % "HikariCP-java6" % "2.3.3",
)

顺便说一句,我发现您上面指定的配置结构在 Slick 3.0.0 中实际上不起作用。对我有用的是按照文档 http://slick.typesafe.com/doc/3.0.0/database.html#using-typesafe-config 中的描述指定数据库配置,否则 Slick 将为配置假定一些默认值。我主要说的是"properties"字段。

所以像这样的东西应该可以工作:

mydb = {
  dataSourceClass = "org.postgresql.ds.PGSimpleDataSource"
  properties = {
    serverName = "postgresdb"
    portNumber = "5432"
    databaseName = "mydb"
    user = "myuser"
    password = "secret"
  }
  numThreads = 10
}