При обращении нескольких приложений Java к одному HSQLDB приложение зависает - PullRequest
8 голосов
/ 01 декабря 2010

Это частично связано с моим предыдущим вопросом . Как говорится в предыдущем вопросе, у меня есть настольное приложение, которое вызывает другой метод Main, который запускает определенный процесс. Как настольное приложение, так и отдельный метод Main будут обращаться к одной и той же базе данных HSQLDB.

До этого мое настольное приложение только что получило доступ к базе данных HSQLDB с помощью URL-адреса подключения, подобного следующему:

jdbc:hsqldb:file:/some/path/myDatabase

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

Я посмотрел документацию HSQLDB и этот пост о Создание общей базы данных HSQLDB , но безрезультатно.

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

Глядя на официальную документацию HSQLDB, в ней говорится, что вы можете запустить сервер HSQLDB следующим образом:

java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 file:mydb -dbname.0 xdb

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

[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@6ca1c]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@6ca1c]: Startup sequence initiated from main() method
[Server@6ca1c]: Loaded properties from [/some/path/myDatabase/server.properties]
[Server@6ca1c]: Initiating startup sequence...
[Server@6ca1c]: Server socket opened successfully in 16 ms.

Затем я изменил URL своего соединения на следующий:

jdbc:hsqldb:hsql://localhost/xdb

Кажется, это не работает для меня. Есть идеи о том, что я сделал неправильно или чего мне не хватает?

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

Ответы [ 3 ]

10 голосов
/ 01 декабря 2010

, используя jdbc:hsqldb:file:/some/path/myDatabase, вы создаете базу данных в процессе, поэтому ее не следует разделять между несколькими JVM (в идеале), однако в соответствии с руководством есть способ

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

imho, лучший способ - запустить в режиме серверав отдельном jvm.

update :

проверяет журнал при запуске сервера hsqlsdb:

[Server@83cc67]: Initiating startup sequence...
[Server@83cc67]: Server socket opened successfully in 31 ms.
[Server@83cc67]: Database [index=0, id=0, db=file:test, alias=] opened sucessfully in 250 ms.

соответствует псевдониму вURL драйвера

Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/", "sa", "");

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

4 голосов
/ 01 декабря 2010

Ответ @kunal правильный. Но у вас есть файл server.properties, который может содержать следующие настройки:

server.database.0 file:mydb 
server.dbname.0 xdb

Используйте либо файл server.properties для настроек, либо, в качестве альтернативы, командную строку. Не используйте оба.

После запуска сервера настольное приложение больше не может подключаться к базе данных с URL-адресом jdbc:hsqldb:file:/some/path/myDatabase. Он должен соединиться с jdbc:hsqldb:hsql://localhost/xdb URL.

HSQLDB имеет общее решение для вызова метода main для другого процесса. Используйте этот класс для вызова любого процесса Источник класса MainInvoker

2 голосов
/ 10 марта 2016

У меня была похожая проблема, одно приложение пишет в hsqldb, а другое читает из него.

Я решил все без использования Server, все, что я использовал, было найдено несколько конфигураций здесь .

Я добавил следующие свойства:

  • приложение, которое пишет:
    • readonly = false
    • hsqldb.lock_file = false
  • приложение, которое читает только:
    • readonly = true
...