【发布时间】: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