Я пишу собственный файл данных в scala. Чтобы проверить, что мои результаты верны, я проверяю с MySQL внутри спецификации specs2. Я получаю правильный результат, и все в порядке. Но если я снова проведу тест без каких-либо изменений, я получу 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()
}
}
}
}
Я оставил некоторые части моего кода, потому что они не принадлежат к этому вопросу.
Edit # 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())
}
}
}
Я не получаю Exception больше, потому что я подавляю его с помощью PreExecution Тэта. Но я все еще удивляюсь, что здесь происходит не так.
Можете ли вы показать исходный код функции, которую вы используете для создания соединения с базой данных? –
было бы лучше, если вы поделитесь своим кодом. –
Я отредактировал мой вопрос, так что теперь есть код. –