我连接到一个postgres数据库与scala(2.9.2)。
第一次我做一个SELECT(通过在IntelliJ的sbt终端中运行带有'run'的代码),它工作得很好,但如果我在sbt shell中再次'run',我得到一个错误,声称:
[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连接器,在我的构建中这一行。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"))
}
}
}
我们必须将此添加到我们的集成测试启动中,以解决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"))
}
}
}
主要问题是您正在尝试使用旧的DriverManager方法加载驱动程序。你必须使用数据库。forDataSource方法,并使用适当的数据库池,如C3P0。
我认为这是Slick, SBT和Driver之间的类加载问题。
显然要确保驱动程序在类路径中