2010-05-04 46 views
9

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

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

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

+0

Было бы хорошо, если бы вы перечислили комбинации, которые вы пробовали. –

+0

У вас возникли проблемы с настройкой сервера (для прослушивания на каком-то TCP-порту) или клиентом (для подключения к серверу)? –

ответ

10

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

2

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

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

From the h2 docs:

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

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

5

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

Согласно official documentation H2 в:

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

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

И я нашел рабочий раствор на этом парень blog:

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

jdbc:h2:mem:db1

, и это будет нуждаться для запуска tcp:

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

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

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

И что это! Работал как шарм!