我正在用scala寫一個自己的數據庫。爲了驗證我的結果是否正確,我使用specs2規範中的MySQL進行了檢查。我得到了正確的結果,一切都很好。但是如果我再次運行測試而沒有任何改變,我會得到一個SQLException: No suitable driver found for jdbc:mysql://localhost:3306/DBNAME?user=DBUSER (null:-1)
。爲什麼驅動程序不能再次加載?不能多次連接到mysql
編輯
import java.sql.{ Connection, DriverManager, ResultSet }
import org.specs2.mutable.Specification
// SDDB imports ...
class DBValidationSpec extends Specification {
"SDDB and MySQl" should {
// SDDB
// ...
// JDBC
val connectionString = "jdbc:mysql://localhost:3306/sddb_test?user=root"
val query = """SELECT content, SUM(duration) duration
FROM test
WHERE times
BETWEEN '2011-12-08'
AND '2011-12-09'
GROUP BY content"""
classOf[com.mysql.jdbc.Driver]
"give the same result" in {
// ...
//sddbResult
lazy val conn = DriverManager.getConnection(connectionString)
try{
val rs = conn.createStatement().executeQuery(query)
var mysqlResult = Map[List[String], Int]()
while (rs.next) {
mysqlResult += (rs.getString("content") :: Nil) -> rs.getInt("duration")
}
sddbResult == mysqlResult && sddbResult.size == 478 must beTrue
} finally {
conn.close()
}
}
}
}
我離開了我的代碼的某些部分,因爲它們不屬於問題。
編輯#2
問題變得更加古怪。我添加了第二個測試用例。測試用例使用相同的connectionString
。異常只提出一次。第二次測試成功。我將sequential
添加到我的測試定義中,並看到只有第一次執行的測試引發了異常。之後,我追查classLoader
以檢查它是否是同一個。它是。
我做了以下解決方法:
trait PreExecuting extends Before {
override def before {
var conn: Option[Connection] = None
try {
val connectionString = "jdbc:mysql://localhost:3306/sddb_test?user=root"
conn = Some(DriverManager.getConnection(connectionString))
} catch {
case _ =>
} finally {
conn map (_.close())
}
}
}
我沒有得到任何的異常更多的是因爲我通過使用預執行泰特壓制它。但我仍然想知道這裏出了什麼問題。
你可以顯示你用來創建數據庫連接的函數的源代碼嗎? –
如果你分享你的代碼會更好。 –
我編輯了我的問題,所以現在是一些代碼。 –