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