2012-05-14 6 views
2

Я пишу собственный файл данных в 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 Тэта. Но я все еще удивляюсь, что здесь происходит не так.

+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

После этого я получаю исключение в каждом тестовом файле. –

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. Надеюсь, эта помощь.

Смежные вопросы