У меня есть база данных H2 с URL "jdbc:h2:test"
. Я создаю таблицу, используя CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));
. Затем я выбираю все из этой (пустой) таблицы, используя SELECT * FROM PERSON
. Все идет нормально.
Однако, если я изменю URL-адрес на "jdbc:h2:mem:test"
, единственное отличие в том, что база данных теперь находится только в памяти, это дает мне org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
. Я, наверное, упускаю что-то простое здесь, но любая помощь будет оценена.
Person
. H2 ничего не знает о базе данных, которую вы создали на диске раньше.Ответы:
DB_CLOSE_DELAY=-1
hbm2ddl закрывает соединение после создания таблицы, поэтому h2 отбрасывает его.
Если ваш URL-адрес подключения настроен следующим образом
содержимое базы данных теряется в момент закрытия последнего соединения.
Если вы хотите сохранить свой контент, вы должны настроить URL следующим образом
В этом случае h2 сохранит свое содержимое до тех пор, пока vm живет.
Обратите внимание на точку с запятой (
;
), а не на двоеточие (:
).См. Раздел « Базы данных в памяти » на странице « Функции» . Цитировать:
источник
jdbc:h2:mem:;DB_CLOSE_DELAY=-1
не работает.Я знаю, что это был не ваш случай, но у меня была та же проблема, потому что H2 создавал таблицы с именами UPPERCASE, а затем вел себя с учетом регистра, хотя во всех сценариях (в том числе в сценариях создания) я использовал строчные буквы.
Решается добавлением
;DATABASE_TO_UPPER=false
к URL-адресу подключения.источник
DATABASE_TO_UPPER=false
вещь как оператор SQL в сценарии инициализации? (Точно так же, как утверждение типаSET MODE PostgreSQL;
) Если так, какой точный синтаксис?Трудно сказать. Я создал программу для проверки этого:
Тест завершился без сбоев и непредвиденных результатов. Какую версию h2 вы используете?
источник
База данных H2 в памяти хранит данные в памяти внутри JVM. Когда JVM завершает работу, эти данные теряются.
Я подозреваю, что то, что вы делаете, похоже на два Java-класса ниже. Один из этих классов создает таблицу, а другой пытается вставить в нее:
и
Когда я запускал эти классы один за другим, я получал следующий вывод:
Как только первый
java
процесс завершается, созданная таблицаCreateTable
больше не существует. Итак, когда появляется класс InsertIntoTable, для него нет таблицы для вставки.Когда я изменил строки подключения на
jdbc:h2:test
, я обнаружил, что такой ошибки не было. Я также обнаружил, что файлtest.h2.db
появился. Это было то место, где H2 поместил таблицу, и поскольку она была сохранена на диске, таблица все еще была там для класса InsertIntoTable, чтобы найти.источник
registerDriver()
вызов не нужен: во-первых: простой Class.forName () делает то же самое для большинства драйверов JDBC и (что более важно) совершенно не нужен для Java 6 и выше, который автоматически определяет (совместимые) драйверы JDBC на CLASSPATH.Я пытался добавить
Однако это не помогло. На сайте H2 я нашел следующее, что действительно может помочь в некоторых случаях.
Однако моя проблема заключалась в том, что только схема должна отличаться от схемы по умолчанию. Так что за использование
Я должен был использовать:
Тогда таблицы были видны
источник
У меня была та же проблема, и я изменил свою конфигурацию в application-test.properties так:
И мои зависимости:
И аннотации, используемые на тестовом классе:
источник
Я пытался получить метаданные таблицы, но обнаружил следующую ошибку:
С помощью:
вернул пустой ResultSet.
Но вместо этого он использовал следующий URL:
Возникла необходимость указать: DATABASE_TO_UPPER = false
источник
При открытии h2-консоли URL JDBC должен соответствовать указанному в свойствах:
Что кажется очевидным, но я потратил часы, чтобы понять это ..
источник
Решается путем создания новой папки src / test / resources + insert application.properties, в которой явно указывается создание тестовой базы данных:
источник
Я пришел на этот пост, потому что у меня была такая же ошибка.
В моем случае эволюция базы данных не была выполнена, поэтому таблицы там вообще не было.
Моя проблема заключалась в том, что структура папок для сценариев эволюции была неправильной.
от: https://www.playframework.com/documentation/2.0/Evolutions
У меня была папка с именем conf / evolutions.default, созданная Eclipse. Проблема исчезла после того, как я исправил структуру папок в conf / evolutions / default
источник
источник
Имел точно такую же проблему, пробовал все вышеописанное, но безуспешно. Довольно забавной причиной ошибки было то, что JVM запускалась слишком быстро, до того, как была создана таблица БД (с использованием файла data.sql в src.main.resources). Поэтому я установил таймер Thread.sleep (1000), чтобы подождать всего секунду, прежде чем вызвать «select * from person». Работаем без нареканий сейчас.
application.properties:
data.sql:
PersonJdbcDAO.java:
основной класс:
источник
Я обнаружил, что он работает после добавления зависимости Spring Data JPA от загрузочной версии Spring 2.2.6.RELEASE -
Добавьте конфигурацию H2 DB в application.yml -
источник
Я нашел решение, добавив эту конфигурацию:
Полная конфигурация (с простым spring.datasource.url):
Я работаю с h2 версии 1.4.200 и Spring-Boot 2.2.6.RELEASE
источник
Time.sleep (1000);
Это работа для меня. Просто попробуйте, если ваш компьютер работает медленно, вы можете увеличить продолжительность потока, чтобы БД работала нормально, а JVM могла получить нашу таблицу.
источник