Есть дополнительные подключения к Дерби (только для чтения) - PullRequest
8 голосов
/ 09 сентября 2010

Что я хочу сделать: мое приложение полностью подключено к базе данных Derby, и я хочу параллельно просматривать базу данных (только для чтения) (используя другой инструмент).

Я не уверен, как на самом деле работает Derby, но я понимаю, что у меня может быть только 1 активное соединение с БД Derby. Однако, поскольку БД состоит только из файлов на моем жестком диске, не могу ли я открыть дополнительные подключения к нему в режиме только для чтения?

Есть ли инструменты для этого?

Ответы [ 4 ]

7 голосов
/ 09 сентября 2010

Существует две возможности запуска Apache Derby DB.

  1. Embedded : вы запускаете БД в своем приложении & rarr; возможно только одно соединение
  2. Клиент : вы запускаете БД как сервер в отдельном процессе & rarr; классическая БД с множеством соединений

Вы можете узнать тип по размеру драйвера. Если драйвер имеет более 2 МБ, то вы используете встроенную версию.

Обновление

При запуске модуля derby (серверного или встроенного) он получает эксклюзивный доступ к файлам базы данных.

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

Подробнее см. Поведение системы с двойной загрузкой .

5 голосов
/ 09 марта 2013

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

Возможно запустить сетевой сервер Derby в JVM, которая уже использует встроенную базу данных. Код, использующий встроенную базу данных Derby, не должен ничего менять и может продолжать использовать базу данных как есть, но с запуском Derby Network Server другие программы могут подключаться к derby и получать доступ к базе данных.

Все, что вам нужно сделать, это убедиться, что derbynet.jar находится на пути к классам

И тогда вы можете сделать одно из следующих действий

  • Включить следующую строку в файл derby.properties: derby.drda.startNetworkServer=true

  • Укажите свойство как системное свойство при запуске Java java -Dderby.drda.startNetworkServer=true

  • Вы можете использовать API-интерфейс NetworkServerControl для запуска сетевого сервера из отдельного потока в приложении Java: NetworkServerControl server = new NetworkServerControl(); server.start (new PrintWriter(System.out));

Подробнее здесь: http://db.apache.org/derby/docs/10.9/adminguide/tadminconfig814963.html

Имейте в виду, что это не обеспечивает никакой безопасности для этого соединения, поэтому не рекомендуется делать это в производственной системе. Возможно добавить безопасность, и это описано здесь: http://db.apache.org/derby/docs/10.9/adminguide/cadminnetservsecurity.html

1 голос
/ 27 апреля 2017

Если вы можете себе позволить память и не нуждаетесь в актуальных данных, вы можете получить доступ к базам данных только для чтения из нескольких JVM, создав копии в памяти:

ij> connect 'jdbc:derby:memory:memdb;restoreFrom=mydb';
1 голос
/ 09 сентября 2010

Две другие идеи:

  1. В вашем приложении закройте базу данных и закройте соединение, когда база данных не используется активно.Тогда ваше приложение не будет мешать другому инструменту, который пытается открыть базу данных.
  2. Сделайте копию своей базы данных, сделав резервную копию (вы можете сделать это, когда база данных открыта вашим приложением),затем восстановите эту резервную копию в отдельном месте на вашем диске.Затем вы можете использовать другой инструмент для доступа к скопированной базе данных по вашему усмотрению.
...