Подтвердить что ты не робот

Осмотреть в памяти hsqldb во время отладки

Мы используем hdsqldb в памяти для запуска тестов junit, которые работают с базой данных. Перед запуском каждого теста с помощью конфигурации spring db настроен. Все работает нормально. Теперь, когда тесты терпят неудачу, может быть удобно проверять значения в базе данных памяти. Это возможно? Если да, то как? Наш URL:

jdbc.url = JDBC: HSQLDB: MEM: TESTDB; sql.enforce_strict_size = истина

База данных уничтожается после каждого теста. Но когда работает отладчик, база данных также должна оставаться в живых. Я попытался подключиться к sqlb databaseManager. Это работает, но я не вижу никаких таблиц или данных. Любая помощь очень ценится!

4b9b3361

Ответ 1

HSQL находится в памяти, поэтому, когда вы говорите, что подключаетесь с помощью диспетчера баз данных SQLDB, вы этого не делаете - вместо этого вы подключаетесь к другой базе данных в области памяти диспетчера баз данных SQLDB, а не к той, которая находится в области памяти unit тест. Вот почему база данных в диспетчере баз данных SQLDB пуста.

Вы можете запустить HSQL как сервер, используя org.hsqldb.Server как описано здесь.

Хотя класс org.hsqldb.Server обычно используется для запуска отдельного процесса, вы можете создать его экземпляр и настроить его в модульном тесте, который должен позволить удаленному процессу подключаться и запрашивать базу данных.

В качестве альтернативы вам придется написать какую-то функциональность дампа, которая вызывается изнутри вашего модульного теста по мере необходимости.

Кроме того, использование HSQL в модульных тестах просто доказывает, что ваш код работает против HSQL, который отличается от реальной базы данных. Это означает, что вы можете получить ложные срабатывания и наоборот. То же самое может быть достигнуто с помощью API-интерфейса или лучше, за исключением тестирования базы данных для некоторых достойных интеграционных тестов, которые работают с реальной базой данных.

Ответ 2

В вашем unit test или в методе @Before/setUp() вы можете добавить следующую строку для запуска менеджера баз данных HSQL:


org.hsqldb.util.DatabaseManager.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

или для улучшенной версии Swing


org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

Менеджер БД позволяет вам проверять вашу схему и запускать SQL-запросы в базе данных в реальном времени во время работы приложения.

Убедитесь, что вы указали точку доступа или приостановили выполнение так или иначе, если хотите проверить состояние своей базы данных на определенной строке.

Ответ 3

Запустите ваш unit тест до точки останова, затем в перспективе Debug Eclipse откройте представление Display (Окно, Показать представление, Показать) и введите

    org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

(согласно сообщению dimdm), выделите его, щелкните правой кнопкой мыши и выберите "Выполнить".

enter image description here

Ответ 4

Вы также можете использовать класс DatabaseManagerSwing, включенный в [HSQLDB] [1], передавая ему открытое соединение, которое позволяет вам видеть состояние базы данных в транзакции, в которой находится соединение.

DatabaseManagerSwing manager = new DatabaseManagerSwing();
manager.main();
manager.connect(connection);
manager.start();

Ответ 5

Вышеупомянутый принятый ответ прекрасно работает, только если имя базы данных, имя пользователя и пароль не затронуты (testdb, SA, пустой пароль).

Для пользовательского имени базы данных, имени пользователя и пароля вы получите следующее исключение

java.sql.SQLInvalidAuthroizationSpecException: неверная спецификация авторизации - не найдено: SA

Затем вы должны подключиться вручную.

Для прямого подключения используйте следующий фрагмент

org.hsqldb.util.DatabaseManager.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

или для улучшенной версии Swing

org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:yourdbname", "--noexit",
  "--user", "dbusername", "--password", "dbpassword"
});

Перед выполнением приведенного выше фрагмента обновите следующее

  • yourdbname - обновите yourdbname реальным именем базы данных
  • dbusername - обновить dbusername, указав имя пользователя вашей базы данных.
  • dbpassword - обновите dbpassword своим паролем базы данных

Ответ 6

Проблема с зависанием менеджера баз данных может быть решена путем запуска менеджера баз данных в новом потоке и спящего потока, в котором выполняется тест.

Добавьте этот фрагмент кода в свой тест, и вы сможете проверить базу данных во время отладки. Не забудьте изменить url-адрес базы данных для вашей базы данных.

Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
                    "--url",  "jdbc:hsqldb:mem://localhost:9001", "--noexit"
            });
        }
    });

t.start();

try {
    Thread.sleep(10000000);
} catch (InterruptedException e) {
    e.printStackTrace();
}