【问题标题】:Slick can't connect to mssql databaseSlick 无法连接到 mssql 数据库
【发布时间】:2019-04-24 02:11:26
【问题描述】:

我想使用 Slick (3.2.3) 连接到 MSSQL 数据库。

目前,我的项目如下。

在application.conf,我有

somedbname = {
  driver = "slick.jdbc.SQLServerProfile$"
  db {
    host = "somehost"
    port = "someport"
    databaseName = "Recupel.Datawarehouse"
    url = "jdbc:sqlserver://"${somedbname.db.host}":"${somedbname.db.port}";databaseName="${somedbname.db.databaseName}";"
    user = "someuser"
    password = "somepassword"
  }
}

“somehost”看起来像 XX.X.XX.XX,其中 X 是数字。

我的build.sbt 包含

name := "test-slick"

version := "0.1"

scalaVersion in ThisBuild := "2.12.7"

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "3.2.3",
  "com.typesafe.slick" %% "slick-hikaricp" % "3.2.3",
  "org.slf4j" % "slf4j-nop" % "1.6.4",
  "com.microsoft.sqlserver" % "mssql-jdbc" % "7.0.0.jre10"
)

带有“main”对象的文件包含

import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile
import slick.jdbc.SQLServerProfile.api._

import scala.concurrent.Await
import scala.concurrent.duration._


  val dbConfig: DatabaseConfig[JdbcProfile] = DatabaseConfig.forConfig("somedbname")

  val db: JdbcProfile#Backend#Database = dbConfig.db

  def main(args: Array[String]): Unit = {
    try {

      val future = db.run(sql"SELECT * FROM somettable".as[(Int, String, String, String, String,
        String, String, String, String, String, String, String)])

      println(Await.result(future, 10.seconds))

    } finally {
      db.close()
    }


  }

}

根据我能找到的所有文档,这应该足以连接到数据库。但是,当我运行它时,我得到了

[error] (run-main-0) java.sql.SQLTransientConnectionException: somedbname.db - Connection is not available, request timed out after 1004ms.
[error] java.sql.SQLTransientConnectionException: somedbname.db - Connection is not available, request timed out after 1004ms.
[error]         at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:548)
[error]         at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186)
[error]         at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
[error]         at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:83)
[error]         at slick.jdbc.hikaricp.HikariCPJdbcDataSource.createConnection(HikariCPJdbcDataSource.scala:14)
[error]         at slick.jdbc.JdbcBackend$BaseSession.<init>(JdbcBackend.scala:453)
[error]         at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:46)
[error]         at slick.jdbc.JdbcBackend$DatabaseDef.createSession(JdbcBackend.scala:37)
[error]         at slick.basic.BasicBackend$DatabaseDef.acquireSession(BasicBackend.scala:249)
[error]         at slick.basic.BasicBackend$DatabaseDef.acquireSession$(BasicBackend.scala:248)
[error]         at slick.jdbc.JdbcBackend$DatabaseDef.acquireSession(JdbcBackend.scala:37)
[error]         at slick.basic.BasicBackend$DatabaseDef$$anon$2.run(BasicBackend.scala:274)
[error]         at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1135)
[error]         at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[error]         at java.base/java.lang.Thread.run(Thread.java:844)
[error] Nonzero exit code: 1

也许相关但也很烦人,当我第二次(及后续)运行此代码时,我收到以下错误:

Failed to get driver instance for jdbcUrl=jdbc:sqlserver://[...]

这迫使我每次都杀死并重新加载 sbt。

我做错了什么?值得注意的是:我可以使用来自 valentina 等软件的相同凭据连接到数据库。

【问题讨论】:

  • 您在哪个 Java 版本上运行?
  • @MarkRoottevel java 10.0.1。可能不是一个好主意...你认为我应该降级到 java 8 吗?
  • 该错误本身意味着Hikari无法获得连接,这意味着池已耗尽或无法创建连接。鉴于您使用了 Java 10 驱动程序,我曾希望它可能像使用 Java 8 一样简单,但可惜。我能想到的唯一另一件事是驱动程序没有自动加载;您可能需要在配置中明确指定它或先自己加载它。鉴于我不知道 slick,也不知道 Scala,我不确定如何或在哪里。
  • @MarkRotteveel 感谢您的建议,我会尝试明确指定驱动程序。

标签: sql-server scala jdbc slick


【解决方案1】:

按照@MarkRotteveel 的建议,并遵循this link,我找到了解决方案。

首先,我明确设置驱动,添加行

driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"

在 db 字典中,在 password = "somepassword" 之后。

其次,默认超时(一秒后)对于我的目的来说似乎太短了,因此我添加了该行 connectionTimeout = "30 seconds" 在前面的driver 行之后,仍然在db 字典中。

现在可以了。

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 2020-03-07
    • 1970-01-01
    • 2017-12-22
    • 2010-10-02
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多