База данных не найдена, и IFEXISTS=true, поэтому мы не можем создать ее автоматически

Я получаю сообщение об ошибке после открытия консоли базы данных h2. Я ввожу имя базы данных, но он показывает, что база данных не найдена:

Database "C:/Users/Barlekar/onlineshoppings" not found, and IFEXISTS=true, so we cant auto-create it [90146-199] 90146/90146 (Help)

org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/Barlekar/onlineshoppings" not found, and IFEXISTS=true, so we cant auto-create it [90146-199]

Попробуйте предыдущую версию 1.4.198. У меня также были проблемы после обновления с [1.4.188] до [1.4.199], но [1.4.198] у меня работает нормально.

Yuriy Balakhonov 21.05.2019 14:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
25
1
52 473
23

Ответы 23

Вы недавно обновили H2? Это может быть причиной.

Это связано со следующим коммитом H2:

https://github.com/h2database/h2database/commit/8b53f3999c6c5c3d5ca29020e2657968f4f59ec4

и изменение было сделано из-за этого эксплойта:

https://www.exploit-db.com/exploits/45506

Это означает, что по умолчанию для H2 теперь установлено автоматическое создание баз данных нет при работе в автономном сетевом режиме.

Если вы прочитали и поняли вышеизложенное, но по-прежнему хотите разрешить автоматическое создание базы данных, просто добавьте флаг -ifNotExists в команду запуска h2 следующим образом:

java -cp h2*.jar org.h2.tools.Server -ifNotExists

Пожалуйста, дайте нам решение.

Bandham Manikanta 18.05.2019 18:16

@BandhamManikanta Как я уже писал в ответе, просто добавьте -ifNotExists к команде, которую вы используете для запуска h2.

joelittlejohn 05.06.2019 17:46

@joelittlejohn, я попытался добавить -ifNotExists в конфигурацию среды выполнения IntelliJ (в разделе «Аргументы программы»), но, похоже, это не работает. Я делаю что-то неправильно?

AnonymousAngelo 26.06.2019 10:19

@AnonymousAngelo, вы также можете добавить эту конфигурацию в свой application.properties следующим образом: spring.datasource.url=jdbc:h2:mem:testdb;IFEXISTS=false"

Ivan 25.07.2019 02:48

@ Anon567, я пробовал это ... единственное, что у меня получилось, - это перейти на более раннюю версию, как упоминает Шон Дашджян выше.

AnonymousAngelo 25.07.2019 14:14

@AnonymousAngelo java -cp h2*.jar org.h2.tools.Server -ifNotExists выполнит эту работу

shvahabi 15.05.2020 14:50

@shvahabi: пожалуйста, превратите свой комментарий в ответ, вы обязательно получите галочку «правильный ответ». Пожалуйста, также добавьте, что это изменилось где-то между 1.4.197 и 1.4.200, потому что я только что обновился и не мог создать базу данных так, как раньше.

rychu 17.05.2020 15:47

@rychu, поскольку он в значительной степени основан на текущем ответе, я решил не давать новый ответ, а просто отредактировал его и привел пример, чтобы было понятно.

shvahabi 23.05.2020 13:07

Используйте версию зависимости базы данных H2 до 2019 года, которая автоматически создает базу данных каждый раз, когда вы запускаете автономное приложение. Например версия 1.4.193. Ваш pom.xml должен включать эту зависимость:

<dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.193</version>
</dependency>

Проблематично, если вы хотите, чтобы функции были доступны в более поздних версиях.

AlikElzin-kilaka 06.06.2019 09:05

Я согласен с @AlikElzin-kilaka. Это не может быть решением. Я не устанавливаю версию H2, потому что предпочитаю, чтобы она зависела от версии Spring Boot, которую я использую.

AnonymousAngelo 26.06.2019 10:16

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

Deep Roy 14.10.2021 06:35

Если вы имеете дело с проектом Spring Boot, измените URL-адрес JDBC jdbc:h2:~/test на jdbc:h2:mem:testdb на странице входа, который является URL-адресом по умолчанию, настроенным Spring Boot.

Работал как шарм!

Itay Feldman 16.08.2019 18:33

Спасибо, но как мы можем изменить значение URL-адреса JDBC по умолчанию с jdbc:h2:~/test на jdbc:h2:mem:testdb?

chill appreciator 18.08.2019 21:28

@standalone после успешного входа в систему следующий сеанс будет заполнен последним успешным URL-адресом JDBC, который, как я полагаю, заполняется из .h2.server.properties

ganesan arunachalam 02.11.2019 07:19

Это создаст базу данных в памяти, а jdbc:h2:~/test будет базой данных в файловой системе, что сделает ее постоянной.

NK_Mimrot 29.08.2020 14:12

Ухудшив версию, база данных H2 работает, но таблицу я не вижу. Фрагмент кода

Контроллер

@RestController
public class CurrencyExchangeController {

    @Autowired
    private Environment env;
    @GetMapping("/currency-exchange/from/{from}/to/{to}")
    public CurrencyExchange retriveCurrencyExchange(@PathVariable String from,@PathVariable String to)
    {
        CurrencyExchange currencyExchange = new CurrencyExchange(1000L, from, to, BigDecimal.valueOf(65));
        currencyExchange.setPort(Integer.parseInt(env.getProperty("local.server.port")));
        return currencyExchange;

    }

ПОЖО

@Entity
public class CurrencyExchange {
    @Id
    private Long id;
    @Column(name  = "currency_from")
    private String from;
    @Column(name  = "currency_to")
    private String to;
    @Column(name  = "conversion_multiple")
    private BigDecimal conversion;
    private int port;

Весенний ботинок основной

@SpringBootApplication
@ComponentScan(basePackages = {"com.example"})
public class CurrencyExchangeServiceApplication {

    public static void main(String[] args) throws SQLException {
        SpringApplication.run(CurrencyExchangeServiceApplication.class, args);

    }

app.prop

spring.application.name=currency-exchange-service
server.port=8000

spring.jpa.show-sql=true
spring.h2.console.enabled=true

data.sql file
insert into currency_exchange(id,currency_from,currency_to,conversion_multiple,port)
values(1001,'USD','INR',65,0);
insert into currency_exchange(id,currency_from,currency_to,conversion_multiple,port)
values(1002,'EUR','INR',75,0);

я изменил URL-адрес JDBC на

jdbc:h2:mem:testdb

и это работа

Это должен быть предпочтительный ответ с 2020 года.

nocdib 10.01.2020 14:29

@nocdib самый популярный ответ просто говорит то же самое. Так что нет, этот ответ даже не должен существовать, потому что он не добавляет ценности

chill appreciator 17.11.2021 13:00

просто и красиво. Спасибо!

samivic 17.02.2022 21:32

первая ссылка на jdbc:h2:mem:testdb второй изменил версию Spring Boot на 2.1.3 и все работает

Я столкнулся с этой проблемой и решил следующим образом

  • Чтобы использовать базу данных H2 — ваше приложение должно работать в среде JDK, а не в среде JRE, для изменения выполните следующие действия:

    1. Щелкните правой кнопкой мыши свой проект> свойства
    2. Выберите «Путь сборки Java» слева, затем «Системная библиотека JRE», нажмите «Изменить…».
    3. Выберите «JRE по умолчанию для рабочей области»
    4. Нажмите «Установленные JRE».
    5. Если вы видите JRE, который вы хотите в списке, выберите его (выбор JDK тоже в порядке)
    6. Если нет, нажмите «Поиск…», выберите «Компьютер» > «Windows C:» > «Program Files» > «Java», затем нажмите «ОК».
    7. Теперь вы должны увидеть все установленные JRE, выберите тот, который вам нужен.
    8. Нажмите OK/Готово миллион раз. Я использовал шаги, предоставленные Джорджи здесь -> https://stackoverflow.com/a/29640138


  • В консоли входа H2 URL-адрес по умолчанию, отображаемый Spring Boot, будет jdbc:h2:~/test, он должен фактически совпадать со свойствами приложения весенней загрузки. spring.datasource.url=jdbc:h2:mem:testdb поэтому замените URL-адрес в консоли входа и нажмите «Подключиться». Я использовал [Иван Сюэ] [2], предоставленные здесь шаги -> https://stackoverflow.com/a/56539107

  • Пожалуйста, очистите цель с помощью команды mvn clean и разрешите сборку проекта, если это не требует принудительного использования моментального снимка обновления maven или установки mvn, а затем снова запустите приложение весенней загрузки, чтобы увидеть разницу.

используйте приведенные ниже свойства в pom.xml и снова запустите приложение.

    <?xml version = "1.0" encoding = "UTF-8"?>
<project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

<groupId>com.in28minutes.database</groupId>
<artifactId>database-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>database-demo</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

Я столкнулся с этой проблемой недавно, было две проблемы.

  1. По умолчанию он не заполнялся базой данных в памяти, а jdbc:h2:~/test.
  2. Имя базы данных, которое я настроил в источнике данных, не было test.

когда я изменил URL-адрес JDBC на jdbc:h2:mem:{db-name-in-config}, это сработало как шарм.

Проверьте URL-адрес jdbc, используемый в консоли h2, чтобы убедиться, что он соответствует тому, что вы указали.

Добро пожаловать в СО! Когда вы отвечаете на вопросы множеством других ответов, постарайтесь раскрыть свои плюсы.

David García Bodego 03.11.2019 04:12

Я обнаружил, что вы можете добавить параметр к параметрам запуска «-ifNotExists» при загрузке h2 db. Программно можно сделать так:

Server.createTcpServer("-tcpPort", "[ПОРТ]", "-tcpAllowOthers", "-ifNotExists").start();

Если вы используете командную строку, то же самое

Along with h2 dependency in POM :
<dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
    </dependency>

Я добавил jpa, зависимость репозитория crud в POM, как показано ниже, и у меня это сработало нормально:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

Это не ответ на вопрос.

Javad Alimohammadi 23.04.2020 23:14

Просто добавьте это в файл приложение.свойства:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

После работы и неудач с внешним интерфейсом (консолью) и другими настройками зависимостей это, наконец, сработало!

Bms bharadwaj 24.01.2021 20:18

Проблема:

Database not found or test folder not in c:/user/username/test

Скопируйте и вставьте его в файл application.properties:

spring.datasource.url=jdbc:h2:~/test
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

Проблема была с URL, проверьте. Задача решена.

В дополнение к ответу @Prateik Upadhyay, если вы хотите переименовать свое имя подключения к базе данных во что-то другое, единственное, что сработало для меня, приведено ниже. Я использую версию весенней загрузки 2.2.4. с версией h2 1.4.200.

spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.url=jdbc:h2:~/MyComponentDB;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE;DB_CLOSE_DELAY=-1;MODE=Oracle
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

введите описание изображения здесь

Зависимость от Maven

        <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.193</version>
    </dependency>
</dependencies>

MacOS Каталина 10.15.4 Работал!

I also got this Error. You have to Configured 

*application.properties*

    # temporary data storage
    spring.datasource.url = jdbc:h2:file:C:/data/test (Windows only)
    spring.h2.console.path=/h2
    server.port=8181

You have to create Folder in C: Drive data/test

Go To Browser:

    http://localhost:8181/h2

Then URL:

    jdbc:h2:file:C:/data/test

You Can See in this pic also: [1]

  [1]: https://i.stack.imgur.com/ExFNR.png

You can see youtube Video

https://thewikihow.com/video_yYWPuM8k8K4

Здесь вопрос в том, как включить создание базы данных, когда база данных не существует по заданному пути. запуск по умолчанию базы данных h2 включит условие ifexists=true.

чтобы избежать этого сценария, необходимо запустить базу данных h2 из терминала со следующей опцией. java -cp h2-1.4.199.jar org.h2.tools.Server -ifNotExists

как только вы дадите этот вариант. можно ли создать базу данных с URL-адресом Много раз я хочу создать файл базы данных в определенной папке. как только вы запустите сервер с флагом -ifNotExists, вы можете использовать приведенный ниже синтаксис для создания папки базы данных по вашему выбору. jdbc:h2:tcp://localhost/D:/Working/Sri/Technology/h2/data/books здесь books — это имя базы данных. если не существует, он создаст базу данных книг в данной папке.

Когда мы пытаемся из консоли H2DB, мы не видим фактическую ошибку полностью.

##В консоли показывает:##

>Database "mem:testdb" not found, either pre-create it or allow remote database creation 
>(not recommended in secure environments) [90149-200] 90149/90149

Однако, когда мы выполняем команду для открытия H2 Console

>    java -cp h2-1.4.200.jar org.h2.tools.Server -ifNotExists

##Он показал мне реальную ошибку, какой порт уже используется#

The Web Console server could not be started. Possible cause: another server is already >running at http://191.167.0.7:8082 Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientConnectionException: Exception >opening port "8082" (port may be in use), cause: "java.net.BindException: Address already >in use: bind" [90061-200] at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)

##Решение: завершите процесс, работающий на порту. Так что этот порт доступен для H2##> Найдите pid, используемый для порта

>>D:\H2\bin>netstat -ano | findstr :8082
>>  TCP    [::]:8082              [::]:0                 LISTENING       6376

> Убить ПИД

>>D:\H2\bin>taskkill /PID 6376 /F
>>SUCCESS: The process with PID 6376 has been terminated.

> Запустите консоль H2 сейчас

>java -cp h2-1.4.200.jar org.h2.tools.Server -ifNotExists

Проблема Это сработало для меня :). Я чувствую, что Исключение, отображаемое на консоли, должно быть более четким, чтобы показать порт..

Спасибо

Пожалуйста, не используйте жирный шрифт во всех предложениях.

crg 19.05.2021 08:11

проблема не в URL-адресе или чем-то еще, ниже приведено правило, которое мы должны использовать в этом случае, –

  1. Для базы данных в памяти: замените URL-адрес в консоли H2 на jdbc:h2:mem:testdb
  2. Для базы данных на диске: используйте jdbc:h2:~/testdb

Я получил ту же ошибку, когда впервые попытался открыть консоль H2. Лучший способ - изменить URL-адрес JDBC и заменить его значением, которое присутствует в терминале, строка, в которой говорится -> (Консоль H2 доступна в «/ h2-console». База данных доступна в «JDBC URL») Это правильный способ сделать

Убедитесь, что в вашем проекте также есть Spring Boot Data JPA.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

В последних версиях базы данных H2 следующий снимок экрана может помочь вам войти в экран базы данных H2. Находясь в консоли запуска приложения, мы можем найти URL-ссылку JDBC, которая необходима для запуска консоли базы данных H2 в браузере.

While in Application run console, we can find the JDBC url link which is required to start the H2 database console in browser

Итак, что должен сделать автор ответа, чтобы решить свою проблему...

Roberto C. Rodriguez-Hidalgo 27.09.2021 15:46

Другие вопросы по теме