2

私はscalaで独自のデータベースを書いています。結果が正しいことを確認するために、specs2仕様内のMySQLを確認します。私は正しい結果を得ることができ、すべてがうまくいきます。しかし、変更を加えずにテストを再実行すると、が得られますSQLException: No suitable driver found for jdbc:mysql://localhost:3306/DBNAME?user=DBUSER (null:-1)。ドライバーが再度ロードされないのはなぜですか?

編集

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

問題はさらに奇妙になりました。2つ目のテストケースを追加しました。テストケースは同じを使用しconnectionStringます。例外は1回だけ発生しました。2番目のテストは成功しました。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())
    }
  }
}

PreExecution taitを使用して例外を抑制したため、例外は発生しなくなりました。しかし、私はまだここで何が間違っているのか疑問に思います。

4

3 に答える 3

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()
于 2012-05-15T09:07:35.067 に答える
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 を使用する前に。これが助けになることを願っています。

于 2013-05-19T05:38:24.960 に答える
0

ドライバーは一度だけロードされます。

適切なドライバーがない場合は、通常、接続 URL の構文が正しくないことを意味します。

于 2012-05-14T13:30:16.693 に答える