h2 in-memory таблицы, удаленное подключение

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

Документация структурирует URL-адрес как jdbc:h2:tcp://<host>/mem:<databasename>

Я пробовал много комбинаций, но просто не могу заставить работать удаленное соединение. Работает ли эта функция, может ли кто-нибудь рассказать мне, как они ее использовали.


person Carolyn    schedule 04.05.2010    source источник
comment
Было бы хорошо, если бы вы перечислили комбинации, которые вы пробовали.   -  person Robert Munteanu    schedule 04.05.2010
comment
У вас есть проблема с настройкой сервера (для прослушивания какого-либо TCP-порта) или клиента (для подключения к серверу)?   -  person Grzegorz Oledzki    schedule 11.05.2010
comment
См. также stackoverflow.com/questions/24528160/. В нем упоминается переключатель -tcpAllowOthers, который виден не только в localhost.   -  person Vadzim    schedule 12.03.2019


Ответы (4)


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

Согласно официальной документации H2:

Чтобы получить доступ к базе данных в памяти из другого процесса или с другого компьютера, необходимо запустить TCP-сервер в том же процессе, в котором была создана база данных в памяти. Затем другим процессам необходимо получить доступ к базе данных через TCP/IP или TLS, используя URL-адрес базы данных, например: jdbc:h2:tcp://localhost/mem:db1.

Я выделил важную часть текста жирным шрифтом.

И я нашел рабочее решение в блог:

Первый процесс создаст БД со следующим URL:

jdbc:h2:mem:db1

и потребуется запустить tcp-сервер:

org.h2.tools.Server server = org.h2.tools.Server.createTcpServer().start();

Затем другие процессы могут получить доступ к вашей БД, используя следующий URL-адрес:

"jdbc:h2:tcp://localhost/mem:db1"

И это все! Работал как шарм!

person RealMan    schedule 23.06.2017

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

jdbc:h2:tcp://localhost/mem:db1
jdbc:h2:tcp://127.0.0.1/mem:db1

Полные примеры можно найти здесь, здесь и здесь; связанные примеры рассматриваются здесь.

person trashgod    schedule 04.05.2010

Только что столкнувшись с этой проблемой, я обнаружил, что мне нужно добавить DB_CLOSE_DELAY=-1 к URL-адресу JDBC для подключения TCP. Итак, мои URL-адреса были:

  • На память: jdbc:h2:mem:dbname
  • TCP-соединение: jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1

Из документов h2:

По умолчанию закрытие последнего соединения с базой данных закрывает базу данных. Для базы данных в памяти это означает потерю содержимого. Чтобы база данных оставалась открытой, добавьте ;DB_CLOSE_DELAY=-1 к URL-адресу базы данных.

Отсутствие DB_CLOSE_DELAY=-1 означает, что я не могу подключиться к правильной базе данных через TCP. Соединение установлено, но используется версия, отличная от созданной в памяти (проверено с помощью параметра IFEXISTS=true)

person tddmonkey    schedule 18.12.2014
comment
Я думаю, что DB_CLOSE_DELAY=-1 должно быть в строке подключения в памяти, а не в строке подключения TCP, чтобы команда, создающая базу данных, отвечала за управление ее временем жизни. В идеале внешнее соединение не должно знать о деталях реализации H2 и должно просто запрашивать данные. - person tomfumb; 13.12.2019
comment
Прошло довольно много времени с тех пор, как я использовал H2, но в остальной части моего ответа будет указано, что я имел в виду TCP-соединение. - person tddmonkey; 13.12.2019

В SpringBoot: https://www.baeldung.com/spring-boot-access-h2-database-multiple-apps

@Bean(initMethod = "start", destroyMethod = "stop")
public Server inMemoryH2DatabaseaServer() throws SQLException {
    return Server.createTcpServer(
      "-tcp", "-tcpAllowOthers", "-tcpPort", "9090");
}
person sasynkamil    schedule 17.03.2021