【问题标题】:Accessing postgres using slick is not working使用 slick 访问 postgres 不起作用
【发布时间】:2017-05-25 19:07:38
【问题描述】:

我有以下环境 scala2.11.8 / akka 2.4.8 / slick 3.1.1 / postgreSQL 9.6

我在application.conf中做了如下配置

mydb {
  driver = "slick.driver.PostgresDriver$"
  db {
    url = "jdbc:postgresql://localhost:5432/mydb"
    driver = org.postgresql.Driver
    user="postgres"
    password="postgres"
    numThreads = 10
    connectionPool = disabled
    keepAliveConnection = true
  }
}

数据库访问在类中完成

package mib
import slick.driver.PostgresDriver.api._
import scala.concurrent.ExecutionContext.Implicits.global
class DBAccess {
  import scala.concurrent.Future
  import scala.concurrent._
  import scala.concurrent.duration._
  import slick.backend.DatabaseConfig
  import slick.driver.JdbcProfile
  import slick.driver.PostgresDriver
  import slick.driver.PostgresDriver.api._  
  import slick.jdbc.JdbcBackend.Database

  println("creating database")
 val dbConfig: DatabaseConfig[PostgresDriver] = DatabaseConfig.forConfig("mydb")
 val db = dbConfig.db
 try{
 val accesspoints = TableQuery[mibPoint] 
  // SELECT * FROM users WHERE username='john'
  val q = for (a <- accesspoints) yield a.mib_id
  val dbAction = q.result
  val f: Future[Seq[String]] = db.run(dbAction)
  Await.result(f, Duration.Inf)
  f.onSuccess { case s => println(s"Result: $s") }
  }
  catch
  {
    case _: Throwable =>println("got some exception")
  }
  finally 
    db.close
}

// this is a class that represents the table I've created in the database
  class mibPoint(tag: Tag) extends Table[(String, Double,Double)](tag, "mib_non_info") {
    def mac_id = column[String]("mib_id",O.PrimaryKey)
    def lat = column[Double]("lat")
    def lng = column[Double]("lng")
    def * = (mib_id, lat,lng)
  }

这个类被APP对象调用为

object wmib extends App {    
  val mWBootStrapper =  new bootStrap
  mWBootStrapper.ReadProperties();
  val mdB  = new DBAccess 
}

但是运行后,我总是得到“有一些异常”的输出 我尝试使用 slf4j/logback 启用日志记录,但我在日志中仍然看不到太多。 以上似乎很微不足道,可能我遗漏了一些明显的东西。 提前致谢, 维沙尔

我按照 sarvesh 的建议添加了异常处理。那很酷,谢谢。 但是我的问题消失了,也不例外。 发生了什么? 当天早些时候,我曾尝试使用 java JDBC 方式访问数据库。 即只是为了检查数据库和数据库访问是否有问题。 在此过程中,我下载并在类路径中添加了 postgresDriver。早些时候情况并非如此。 由于驱动程序现在在路径中,因此代码可以正常工作。 由于我没有打印异常,我没有意识到错误。 然后我删除了驱动程序 jar,我得到了以下错误。

01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.JdbcBackend.statement - Preparing statement: select "mib_id" from "mibpoint"
01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.DriverDataSource - Driver org.postgresql.Driver not already registered; trying to load it
java.lang.ClassNotFoundException: org.postgresql.Driver
    at java.lang.ClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at slick.util.ClassLoaderUtil$$anon$1.loadClass(ClassLoaderUtil.scala:12)
    at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:60)
    at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:58)
    at scala.Option.getOrElse(Option.scala:121)

感谢大家的帮助。 维沙尔

【问题讨论】:

  • 抛出的异常和堆栈跟踪在这里可能会有所帮助。
  • 首先请将case _: Throwable =&gt;println("got some exception") 替换为case ex: Throwable =&gt; ex.printStackTrace(),这将打印错误的实际堆栈跟踪。使用该信息更新您的问题。
  • 在您发布堆栈跟踪之前无法帮助您,但我有一个使用 mysql 的最小工作示例,它与 psql github.com/pedrorijo91/play-slick3-steps 应该没有太大区别
  • @vishal @Sarvesh Kumar Singh 追赶 Throwable 肯定不是你想做的事情。在 Java 和 Scala 中,OutOfMemory 异常都扩展了Throwable,因此您的应用程序可能会失败,您将在此处捕获它。这是一个非常糟糕的做法。最多抓Exception
  • @Michał 一旦他了解了基础知识,他就可以继续了解这些细节。

标签: postgresql scala slick


【解决方案1】:

我在第一次使用 Slick 时遇到了同样的连接问题。我提交了这个 PR,详细介绍了如何连接本地 Postgres 服务器。

https://github.com/slick/slick/issues/1861#issuecomment-387616310.

但基本上尝试编辑您的 build.sbt 和 application.conf 文件:

【讨论】:

  • 这样就解决了问题。感谢您分享该 github 链接。 +1
【解决方案2】:

2020 年的答案

你必须确保两件事:

  1. 将驱动程序添加到build.sbtlibraryDependencies"org.postgresql" % "postgresql" % "42.2.5"。这将导致java.sql.DriverManager 的方法getDrivers(由DriverDataSource 类中的slick 使用)找到驱动程序org.postgresql.Driver
  2. 确保application.conf 中的数据库URL 遵循JDBC 的完整URL 模式,如源代码中所述:https://github.com/slick/slick/blob/42d787b4950fe876569b5fd68e98c4e0379ac83c/slick/src/main/scala/slick/jdbc/DatabaseUrlDataSource.scala#L9。例如:postgresql://user:password@localhost:5432/postgres

我的完整配置是:

build.sbt

libraryDependencies ++= Seq(
      ...,
      "org.postgresql" % "postgresql" % "42.2.5"
    )

application.conf

slick-postgres {
  profile = "slick.jdbc.PostgresProfile$"
  db {
    dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
    properties = {
      driver = "org.postgresql.Driver"
      url = "postgresql://postgres:postgres@localhost:5432/postgres"
    }
  }
}

【讨论】:

    【解决方案3】:

    我按照 sarvesh 的建议添加了异常处理。那很酷,谢谢。但是我的问题消失了,也不例外。发生了什么?当天早些时候,我曾尝试使用 java JDBC 方式访问数据库。即只是为了检查数据库和数据库访问是否有问题。在此过程中,我下载并在类路径中添加了 postgresDriver。早些时候情况并非如此。由于驱动程序现在在路径中,因此代码可以正常工作。由于我没有打印异常,我没有意识到错误。然后我删除了驱动程序 jar,我得到了以下错误。

    01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.JdbcBackend.statement - Preparing statement: select "mib_id" from "mibpoint"
    01:44:08.224 [mydb.db-1] DEBUG slick.jdbc.DriverDataSource - Driver org.postgresql.Driver not already registered; trying to load it
    java.lang.ClassNotFoundException: org.postgresql.Driver
        at java.lang.ClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at slick.util.ClassLoaderUtil$$anon$1.loadClass(ClassLoaderUtil.scala:12)
        at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:60)
        at slick.jdbc.DriverDataSource$$anonfun$init$2.apply(DriverDataSource.scala:58)
        at scala.Option.getOrElse(Option.scala:121)
    

    感谢大家的帮助。维沙尔

    【讨论】:

      【解决方案4】:
      mydb {
        dataSourceClass = "slick.jdbc.DatabaseUrlDataSource"
        properties = {
          driver = "slick.driver.PostgresDriver$"
          url = "postgres://postgresql:postgresql@localhost:5432/mydb"
        }
      }
      

      或者..你可以尝试类似,

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

      【讨论】:

        【解决方案5】:

        您需要类路径上的 Postgres 驱动程序:

        尝试将 "org.postgresql" % "postgresql" % "42.1.4" 添加到您的 libraryDependencies。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-04
          • 2016-11-03
          相关资源
          最近更新 更多