h2 таблицы в памяти, удаленное соединение - PullRequest
12 голосов
/ 04 мая 2010

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

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

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

Ответы [ 3 ]

11 голосов
/ 05 мая 2010

Вы можете посмотреть Базы данных в памяти . Для сетевого подключения вам понадобится имя хоста и базы данных. Похоже, вы хотите jdbc:h2:tcp://localhost/mem:db1 или jdbc:h2:tcp://127.0.0.1/mem:db1

9 голосов
/ 23 июня 2017

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

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

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

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

И я нашел рабочее решение в блоге этого парня 1016 *:

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

jdbc:h2:mem:db1

и нужно запустить tcp-сервер:

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

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

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

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

2 голосов
/ 18 декабря 2014

Только что столкнувшись с этой проблемой, я обнаружил, что мне нужно добавить 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)

...