Ошибка при попытке подключения к базе данных H2 - PullRequest
0 голосов
/ 03 марта 2020

Кто-нибудь из вас имел эту ошибку при попытке подключиться к H2? Я использую версию 1.4.199 на windows с TAFJFuctions.

Сначала я запускаю эту команду:
java -server -cp h2-1.4.199.jar;C:\Users\...\H2\TAFJFunctions.jar org.h2.tools.Server -web -tcp -tcpPort 9092 -tcpAllowOthers -baseDir C:\Users\...\H2\bin

, и я подключился к Работает TCP-сервер и сервер веб-консоли. Затем я запустил эту команду:
SET H2URL=jdbc:h2:tcp://locaLhost/t24db;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;TRACE_LEVEL_FILE=0;TRACE_LEVEL_SYSTEM_OUT=0;FILE_LOCK=NO;IFEXISTS=TRUE;CACHE_SIZE=8192;MVCC=TRUE;LOCK_TIMEOUT=60000

И затем эта команда:
java -server -cp h2-1.4.199.jar;C:\Users\...\H2\TAFJFunctions.jar org.h2.tools.Shell -url %H2URL% -driver org.h2.Driver -user t24 -password t24

И здесь у меня есть ошибка ниже:

"Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "C:/Users/.../H2/bin/t24db" not found, and IFEXISTS=true, so we cant auto-create it [90146-199]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.engine.Engine.openSession(Engine.java:67)
    at org.h2.engine.Engine.openSession(Engine.java:201)
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:178)
    at org.h2.engine.Engine.createSession(Engine.java:161)
    at org.h2.server.TcpServerThread.run(TcpServerThread.java:160)
    at java.lang.Thread.run(Unknown Source)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:617)
    at org.h2.engine.SessionRemote.done(SessionRemote.java:607)
    at org.h2.engine.SessionRemote.initTransfer(SessionRemote.java:143)
    at org.h2.engine.SessionRemote.connectServer(SessionRemote.java:431)
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:317)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:169)
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:148)
    at org.h2.Driver.connect(Driver.java:69)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.h2.tools.Shell.runTool(Shell.java:148)
    at org.h2.tools.Shell.main(Shell.java:81)"

Есть идеи, как заставить это работать?

Спасибо, Карина

Ответы [ 2 ]

1 голос
/ 04 марта 2020

С IFEXISTS=TRUE проблема очевидна, но без этого параметра или с попыткой установить его на FALSE ситуация не изменится.

Все последние версии базы данных H2 не позволяют удаленное (включая локальные TCP-соединения) создание базы данных по умолчанию в целях безопасности. Когда это разрешено, каждый, кто может подключиться к вашему порту, может создать новую базу данных, получить в ней привилегии ADMIN и, следовательно, получить такой же доступ к вашей системе, как ваша JVM и ваша учетная запись пользователя.

К сожалению, H2 1.4.199 выдает сбивающее с толку сообщение об ошибке, оно было улучшено только в 1.4.200, и в этой версии (когда IFEXISTS=TRUE не использовалось) сообщение об ошибке «База данных… не найдена, либо предварительно создайте ее, либо разрешите удаленную базу данных» создание (не рекомендуется в безопасных средах) ».

Если вы используете сервер TCP (или Pg / ODB C), вам необходимо каким-либо другим способом создавать базы данных, прежде чем пытаться подключиться к ним через сеть протокол.

Например, вы можете открыть соединение JDB C (DriverManager.getConnection()) со встроенным URL-адресом и немедленно закрыть его.

Вы можете заменить org.h2.tools.Server на org.h2.tools.Console и вы увидите другой URL-адрес http-соединения (если вы запустите его из командной строки), что-то вроде http://127.0.0.2:8082?key=12c58e1c5f9ce1ae88a2921f74e7655ed91a80746730cc6bfa8d4bbb464f69ee; с помощью этого URL вы сможете создать базу данных из веб-интерфейса (только если удаление веб-интерфейса не включено).

Вы также можете добавить параметр -tool (только для Console, Server не поддерживает его), чтобы получить значок H2 Console в системном трее, в его контекстном меню есть команда для создания новой базы данных, и этот значок также может открывать веб-интерфейс с тем же ключом безопасности. Не передавайте этот ключ никому. Однако он будет отличаться при каждом перезапуске.

Вы также можете использовать инструмент командной строки командной строки.

https://h2database.com/html/tutorial.html#creating_new_databases

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

0 голосов
/ 03 марта 2020

Проблема здесь в том, что базы данных с именем t24db уже нет.

В свойстве spring.datasource.url, которое вы используете для подключения к h2, удалите параметр IFEXISTS = TRUE. Это обеспечит создание базы данных, если она не существует.

...