scala中的Postgres JDBC无法在不重新启动sbt的情况下运行两个查询

时间:2013-03-05 11:09:44

标签: postgresql scala jdbc sbt

我使用scala(2.9.2)连接到postgres数据库。

我第一次做一个SELECT(通过在IntelliJ中的sbt终端运行'run'代码)它运行良好,但是如果我在sbt shell中再次“运行”,我会收到一个错误声明:

[error] (run-main) java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost/db
java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost/db
    at java.sql.DriverManager.getConnection(DriverManager.java:602)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at SequenceGenerator$.connect(Validator.scala:50)
    at SequenceGenerator$.generate(Validator.scala:54)
    at Main$.main(Validator.scala:32)
    at Main.main(Validator.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

我已经通过sbt安装了postgres连接器,这是我build.sbt文件中的这一行。

libraryDependencies += "postgresql" % "postgresql" % "9.1-901.jdbc4"

这是我制作SELECT的代码:

object SequenceGenerator{
  def connect() = {
    DriverManager.getConnection("jdbc:postgresql://localhost/db","user", "pass")

  }
  def generate() = {
    val db = connect()
    val st = db.createStatement
    val res = st.executeQuery("SELECT value from table LIMIT 2")
    while( res.next) {
      println(res.getString("value"))
    }
  }
}

2 个答案:

答案 0 :(得分:5)

我们必须将它添加到我们的集成测试启动中,以解决与mysql jdbc驱动程序相同的问题:

Class.forName("com.mysql.jdbc.Driver").newInstance

我不确定为什么SBT会卸载驱动程序,但是这样的东西可能会对你有用:

object SequenceGenerator{
  //Use whatever your jdbc driver class should be here, I'm just guessing
  Class.forName("org.postgresql.Driver").newInstance

  def connect() = {
    DriverManager.getConnection("jdbc:postgresql://localhost/db","user", "pass")
  }
  def generate() = {
    val db = connect()
    val st = db.createStatement
    val res = st.executeQuery("SELECT value from table LIMIT 2")
    while( res.next) {
      println(res.getString("value"))
    }
  }
}

答案 1 :(得分:0)

主要问题是您尝试使用旧的DriverManager方法加载驱动程序。您必须在光滑中使用Database.forDataSource方法并使用适当的数据库池,如C3P0。

我认为这是Slick,SBT和Driver之间的类加载问题。

显然确保驱动程序在类路径中。