2012-05-14 40 views
2

我正在用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()) 
    } 
    } 
} 

我沒有得到任何的異常更多的是因爲我通過使用預執行泰特壓制它。但我仍然想知道這裏出了什麼問題。

+0

你可以顯示你用來創建數據庫連接的函數的源代碼嗎? –

+0

如果你分享你的代碼會更好。 –

+0

我編輯了我的問題,所以現在是一些代碼。 –

回答

0

驅動程序只加載一次。

沒有合適的驅動程序通常意味着連接URL語法不正確。

+0

沒錯,但是如果我經常運行測試的話就會引發異常。 –

1

我不能把這個錯誤固定下來,但至少還好關閉結果集和聲明。

val stmt = conn.createStatement() 
    val rs = stmt.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 
    rs.close() 
    stmt.close() 
+0

做完這些之後,我會在每個測試用例中得到Exception。 –

1

這似乎是與驅動程序註冊的問題,該名司機已被註冊一些像這樣...

DriverManager.registerDriver(new com.mysql.jdbc.Driver()); 
or some like this... 
DriverManager.registerDriver(new DriverWrapper((Driver) Class.forName(props.getProperty("dbg.driver"), true, gcloader).newInstance())); 

之前使用的getConnection。我希望這個幫助。