Блокировка через несколько JVM? - PullRequest
5 голосов
/ 21 сентября 2009

это немного связано с этим вопросом .

Я использую make для извлечения некоторой информации о некоторых программах на Си. Я обертываю компиляцию, используя скрипт bash, который запускает мою Java-программу, а затем gcc. В основном, я делаю:

make CC=~/my_script.sh

Я хотел бы использовать несколько заданий (опция -j с make). Он запускает несколько процессов в соответствии с правилами зависимости.

Если бы я хорошо понял, у меня было бы столько же экземпляров jvm, сколько и рабочих мест, верно?

Дело в том, что я использую sqlite-jdb для сбора информации. Таким образом, проблема состоит в том, как избежать нескольких процессов, пытающихся изменить базу данных одновременно? Кажется, что блокировка sqlite зависит от jvm (я имею в виду, что одну блокировку можно «увидеть» только внутри блокирующей jvm), и это то же самое для RandomAccessFile.lock ().

У вас есть идеи, как это сделать? (создание файла tmp и затем поиск, существует ли он или нет, кажется одной из возможностей, но может быть дорогостоящим. Таблица блокировки в дБ?)

спасибо

Ответы [ 3 ]

9 голосов
/ 21 сентября 2009

java.nio.channels.FileLock разрешает межпроцессную блокировку файлов на уровне ОС.

Однако использование make для запуска сценариев bash, которые запускают несколько JVM параллельно, прежде чем вызывать gcc, звучит слишком рубиново-голдбергским и хрупким для меня.

4 голосов
/ 21 сентября 2009

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

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

вы можете получить библиотеку Java для подключения к memcached здесь .

1 голос
/ 21 сентября 2009

Вы можете попробовать Терракотовая для совместного использования объектов между различными экземплярами JVM. Это может показаться слишком сложным решением для ваших нужд, но, по крайней мере, стоит задуматься.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...